深入理解記憶體 3 記憶體交換技術,虛擬記憶體

2021-07-08 21:08:21 字數 2803 閱讀 2353

2013-01-15 21:14

1560人閱讀收藏

舉報

3) c++(59)

1)it related(21)

目錄(?)

[-]

頁式儲存管理

段式儲存管理

分頁與分段結合

虛擬記憶體

我們知道當多程序在記憶體中共存時,如果記憶體足夠大都夠用,大家相安無事自然是最理想的事了.不過現實往往沒那麼美好.有些時候記憶體會滿了,不夠用了.此時必須將程序從記憶體移到硬碟中去.有空間時可能又會被移回記憶體來.專業點的說法叫 滾出(roll-out),滾進(roll-in).或者叫換出,換入.

在進行換出,換入時你可能會想到兩種方法

(1)以程序為單位換出換進,這是最簡單最容易想到的.但是顯然不夠靈活,因為乙個程序所需的記憶體空間較大.所以這種交換技術現在用的不多

(2)只交換程序的一部分.

通過頁式或段式記憶體管理先把程序的虛擬位址空間劃分為若干頁面或段,這樣交換時就可就交換頁或段.

所謂分頁就是把程序的虛擬位址空間劃分成大小均勻的一頁頁的(實際上就是一塊塊的,把程序切成幾小塊罷了),比如一頁是1k,然後把物理記憶體也劃分成一頁頁的.然後再把兩者對映起來.如下圖.哎發現有時說一堆話學不如乙個圖頂用,下面的圖都是我們從別處拷來的,原位址

當然這個對映關係的資訊肯定要儲存在哪.都儲存在暫存器中.然後通過邏輯位址找實體地址的流程如下圖

分頁時,就是不管三七二十一,都一刀切,把程式切成均勻的一頁頁的.但我們知道程式實際運轉時是成為很多模組的,比如乙個函式可能是乙個模組.如果按程式的邏輯結構來分成更小的組成部分可能更合理.因為程式執行時也可以那樣分成乙個個小的單位去執行的嘛.這裡我們把程式的更小單位叫作業

不過分段儲存管理其實跟分頁管理大的思想理念是一樣的,都是把程式分成更小的單位嘛,便於交換而已.只不過分段不是均勻分成固定大小的頁,而是根據實際情況分在大小不均的段.此時由於段大小不一,所以除了知道每個段的開始位址還必須要有段表長度的資訊.

邏輯位址與實體地址轉換如下圖

分頁與分段自然是各有好處.分段如果每段太大了自然不太好,那還不如乾脆把整個程式交換出去得了,不用整得這麼麻煩

於是有人想著把這兩種方法結合起來,叫段頁式儲存管理.你要以在一段內再使用分頁技術

我們以前講了在32的windows上,每個程式執行時都會分配2g的虛擬位址空間.就算你調大的話也最多就3g.從這句話裡我們可以延伸出這樣一些結論.

1.由於32的系統定址空間只有4g,所以你整個大於4g的記憶體完全是浪費資源.系統只會用到其中的4g,多出來的根本不會去用.

2.你可能想著每個程序都是2g的虛擬位址空間,那乙個程序載入進記憶體豈不是會把記憶體塞滿了啊.實際上不會的,因為一來嘛分配給你2g位址空間.你不一定用這麼多,可能只用10m,這樣載入到記憶體的時候只載入你實際用的.另外就是不會一次把所有程序需要的記憶體分配下來然後把程式載入進來,而只是載入暫時需要的程式**或資料

3.因為每個程序位址空間最大也只能整個3g出來.所以如果你的程序一跑時需要4g的位址空間才夠用.那你的電腦肯定沒法支援的.所以如果一些大型遊戲需要記憶體特別多,你32的系統不管怎麼整就玩不了.

另外你就肯定會有疑問. 過去個幾年我們買電腦時貌似記憶體很多都512m,1g就算多了.然後嘛基本是32的系統.那如果某個程式實際有用到1g記憶體咋整? 因為雖然說程式中分配時是用的虛擬位址空間,但如果你在那2g的虛擬位址空間中實際有用到1g,最後就要對映到實際記憶體中去的啊.而且你1g的記憶體位址可是不能出現重複.這樣那512記憶體肯定不夠用的.

後面就出現了個虛擬記憶體的概念.就是劃出一部分硬碟來當作記憶體用.當在虛擬記憶體空間中實際用到的記憶體大於物理記憶體時需要用到虛擬記憶體.在windows中可以在advanced system settings那裡面去設定虛擬記憶體的大小.不管如果是32位的話虛擬記憶體加上實際記憶體肯定也不能大於4g,不然多出來的那部分也是沒有用處的.

假如還是上面的例子,512m記憶體,然後有1g的程序.你於是可以弄個1g的虛擬記憶體.然後對映的時候,先在實際的記憶體中對映,可能除開系統需要的一部分外就剩下300了.於是就先對映這300的記憶體,剩下的再去虛擬記憶體中對映.

反正你的用的時候只要發個邏輯位址過去.剩下的事就不用管,作業系統有個mmu(memory management unit),裡面會有個頁表.反正你輸入邏輯位址它最終給你轉換成物理記憶體位址或硬碟位址.

至於具體細節比較麻煩的.大概思路是,程序一般會採取分頁技術,分成大小一樣的很多頁,每頁有編號.然後頁表裡面會把你每頁對應記憶體中具體的一塊記憶體.當超過那300的實際上就對應於虛擬記憶體中去了.(實際上就是硬碟上的乙個swp檔案),肯定也有標誌資訊表明這部分是在硬碟上. 於是當程序執行起來時,需要用到某個位址時就對映到虛擬記憶體中時就會出現所謂的缺頁,那頁不在記憶體中嘛,於是就需要去硬碟上把資料讀進記憶體來,如果記憶體滿了就需要置換出去一些頁. 所以你設定了虛擬記憶體,最後如果真的會有用到,那你會看到硬碟轉的很快,然後程式執行速度會變慢.硬碟的操作比記憶體慢很多

深入理解虛擬記憶體管理

訪問虛擬記憶體時的處理流程 一張流程圖,看明白了,一切ok。虛擬位址到實體地址的轉換 win32 中的 指標 意味著虛擬位址。將 32位氛圍 10位 10位 12位,第乙個 10位用來定位頁目錄中的頁目錄項,左移兩位,此頁目錄項指向乙個頁表 第二個 10位定位也表中的頁表項,指向真正的物理記憶體 最...

深入理解虛擬記憶體管理

訪問虛擬記憶體時的處理流程 一張流程圖,看明白了,一切ok。虛擬位址到實體地址的轉換 win32 中的 指標 意味著虛擬位址。將 32位氛圍 10位 10位 12位,第乙個 10位用來定位頁目錄中的頁目錄項,左移兩位,此頁目錄項指向乙個頁表 第二個 10位定位也表中的頁表項,指向真正的物理記憶體 最...

深入理解共享記憶體機制

共享記憶體可以說是最有用的程序間通訊方式,也是最快的ipc形式。是針對其他通訊機制執行效率較低而設計的。兩個不同程序a b共享記憶體的意思是,同一塊物理記憶體被對映到程序a b各自的程序位址空間。程序a可以即時看到程序b對共享記憶體中資料的更新,反之亦然。由於多個程序共享同一塊記憶體區域,必然需要某...