深入理解内存(3):内存交换技术,虚拟内存
深入理解內存(3):內存交換技術,虛擬內存
2013-01-15 21:14 1560人閱讀 評論(0) 收藏 舉報 分類: 3) C++(59) 1)IT Related(21)版權聲明:本文為博主原創文章,未經博主允許不得轉載。
目錄(?)[-]
我們知道當多進程在內存中共存時,如果內存足夠大都夠用,大家相安無事自然是最理想的事了.不過現實往往沒那么美好.有些時候內存會滿了,不夠用了.此時必須將進程從內存移到硬盤中去.有空間時可能又會被移回內存來.專業點的說法叫 滾出(roll-out),滾進(roll-in).或者叫換出,換入.
?
在進行換出,換入時你可能會想到兩種方法
(1)以進程為單位換出換進,這是最簡單最容易想到的.但是顯然不夠靈活,因為一個進程所需的內存空間較大.所以這種交換技術現在用的不多
(2)只交換進程的一部分. 通過頁式或段式內存管理先把進程的虛擬地址空間劃分為若干頁面或段,這樣交換時就可就交換頁或段.
?
頁式存儲管理
所謂分頁就是把進程的虛擬地址空間劃分成大小均勻的一頁頁的(實際上就是一塊塊的,把進程切成幾小塊罷了),比如一頁是1K,然后把物理內存也劃分成一頁頁的.然后再把兩者映射起來.如下圖.哎發現有時說一堆話學不如一個圖頂用,下面的圖都是我們從別處拷來的,圖片原地址http://www.doc88.com/p-982340562158.html
?
當然這個映射關系的信息肯定要保存在哪.都保存在寄存器中.然后通過邏輯地址找物理地址的流程如下圖
?
?
?
段式存儲管理
分頁時,就是不管三七二十一,都一刀切,把程序切成均勻的一頁頁的.但我們知道程序實際運轉時是成為很多模塊的,比如一個函數可能是一個模塊.如果按程序的邏輯結構來分成更小的組成部分可能更合理.因為程序執行時也可以那樣分成一個個小的單位去執行的嘛.這里我們把程序的更小單位叫作業
不過分段存儲管理其實跟分頁管理大的思想理念是一樣的,都是把程序分成更小的單位嘛,便于交換而已.只不過分段不是均勻分成固定大小的頁,而是根據實際情況分在大小不均的段.此時由于段大小不一,所以除了知道每個段的開始地址還必須要有段表長度的信息.
?
邏輯地址與物理地址轉換如下圖
?
?
?
分頁與分段結合
分頁與分段自然是各有好處.分段如果每段太大了自然不太好,那還不如干脆把整個程序交換出去得了,不用整得這么麻煩
于是有人想著把這兩種方法結合起來,叫段頁式存儲管理.你要以在一段內再使用分頁技術
?
?
虛擬內存
我們以前講了在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文件),肯定也有標志信息表明這部分是在硬盤上. 于是當進程運行起來時,需要用到某個地址時就映射到虛擬內存中時就會出現所謂的缺頁,那頁不在內存中嘛,于是就需要去硬盤上把數據讀進內存來,如果內存滿了就需要置換出去一些頁. 所以你設置了虛擬內存,最后如果真的會有用到,那你會看到硬盤轉的很快,然后程序運行速度會變慢.硬盤的操作比內存慢很多
總結
以上是生活随笔為你收集整理的深入理解内存(3):内存交换技术,虚拟内存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 澳门大学健康科学学院生物信息核心实验中心
- 下一篇: 方差分析中的“元”和“因素”是什么?