導(dǎo)航菜單

linux的虛擬內(nèi)存機制

導(dǎo)讀 Linux是一套免費使用和自由傳播的類UNIX操作系統(tǒng),是款獨立的非常強大的系統(tǒng),有著很多的愛好者,那么今天我們就一起來了解一下他那獨特的...

Linux是一套免費使用和自由傳播的類UNIX操作系統(tǒng),是款獨立的非常強大的系統(tǒng),有著很多的愛好者,那么今天我們就一起來了解一下他那獨特的虛擬內(nèi)存機制吧。

虛擬內(nèi)存常見問題

linux的虛擬內(nèi)存機制:

1、每個進(jìn)程都有自己獨立的4G內(nèi)存空間,各個進(jìn)程的內(nèi)存空間具有類似的結(jié)構(gòu)。

Linux內(nèi)存管理采用的是頁式管理,使用的是多級頁表,動態(tài)地址轉(zhuǎn)換機構(gòu)與主存、輔存共同實現(xiàn)虛擬內(nèi)存一個新進(jìn)程建立的時候,

將會建立起自己的內(nèi)存空間,此進(jìn)程的數(shù)據(jù),代碼等從磁盤拷貝到自己的進(jìn)程空間,哪些數(shù)據(jù)在哪里,

都由進(jìn)程控制表中的task_struct記錄,task_struct中記錄中一條鏈表,記錄中內(nèi)存空間的分配情況,

哪些地址有數(shù)據(jù),哪些地址無數(shù)據(jù),哪些可讀,哪些可寫,都可以通過這個鏈表記錄每個進(jìn)程已經(jīng)分配的內(nèi)存空間,都與對應(yīng)的磁盤空間映射。

2、每個程序都能看到一片完整連續(xù)的地址空間,這些空間并沒有直接關(guān)聯(lián)到物理內(nèi)存,而是操作系統(tǒng)提供了內(nèi)存的一種抽象概念,

使得每個進(jìn)程都有一個連續(xù)完整的地址空間,在程序的運行過程,再完成虛擬地址到物理地址的轉(zhuǎn)換。

我們同樣知道,進(jìn)程的地址空間是分段的,存在所謂的數(shù)據(jù)段,代碼段,bbs段,堆,棧等等。每個段都有特定的作用。

同時計算機沒有那么多的內(nèi)存(n個進(jìn)程就需要對應(yīng)n*4G內(nèi)存),建立一個進(jìn)程,就要把磁盤上的程序文件拷貝到進(jìn)程對應(yīng)的內(nèi)存中去,

對于有一個程序?qū)?yīng)多個進(jìn)程這種情況,浪費內(nèi)存。

3、每個進(jìn)程的4G內(nèi)存空間只是虛擬內(nèi)存空間,每次訪問內(nèi)存空間的某個地址,都需要把地址翻譯為實際物理地址所有進(jìn)程共享同一物理內(nèi)存,

每個進(jìn)程只把自己目前需要的虛擬內(nèi)存空間映射并存儲到物理內(nèi)存上進(jìn)程要知道哪些內(nèi)存地址上的數(shù)據(jù)在物理內(nèi)存上,哪些不在,還有在物理內(nèi)存上的哪里,

需要頁表記錄頁表的每一個表項分為兩部分,第一部分記錄此頁是否在物理內(nèi)存上,第二部分記錄物理內(nèi)存的地址當(dāng)進(jìn)程訪問某個虛擬地址,

去查看頁表,如果對應(yīng)的數(shù)據(jù)不在物理內(nèi)存中,,則缺頁異常缺頁異常的處理過程,就是把進(jìn)程需要的數(shù)據(jù)從磁盤拷貝到物理內(nèi)存中,

如果內(nèi)存已經(jīng)滿了 ,沒有空地方,那就找一個頁進(jìn)行覆蓋,當(dāng)然如果被覆蓋的頁曾經(jīng)被修改過,需要將此頁寫回磁盤。

4、竟然每個進(jìn)程的內(nèi)存空間都是一致而且固定的,所以鏈接器在鏈接執(zhí)行文件時,可以設(shè)定內(nèi)存地址,而 不用去管這些數(shù)據(jù)最終實際的內(nèi)存地址,

這是有獨立內(nèi)存 空間的好處當(dāng)不同的進(jìn)程使用同樣的代碼時,比如庫文件中的代碼,物理內(nèi)存中可以只存儲一份這樣的代碼,

不同的進(jìn)程只需要把自己的虛擬內(nèi)存映射過去就可以了,節(jié)省內(nèi)存在程序需要分配連續(xù)的內(nèi)存空間的時候,

只需要在虛擬內(nèi)存空間分配連續(xù)空間,而不需要實際物理內(nèi)存的連續(xù)空間,可以利用碎片。

以上就是給各位小伙伴帶來的linux虛擬內(nèi)存機制的所有內(nèi)容,希望你們會喜歡。更多相關(guān)教程請收藏~

免責(zé)聲明:本文由用戶上傳,如有侵權(quán)請聯(lián)系刪除!

猜你喜歡:

最新文章: