日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深入理解内存(3):内存交换技术,虚拟内存

發(fā)布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解内存(3):内存交换技术,虚拟内存 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

深入理解內(nèi)存(3):內(nèi)存交換技術(shù),虛擬內(nèi)存

1560人閱讀 評論(0) 收藏 舉報 分類: 3) C++(59) 1)IT Related(21)

目錄(?)[-]

  • 頁式存儲管理
  • ?
  • ?
  • 段式存儲管理
  • ?
  • 分頁與分段結(jié)合
  • 虛擬內(nèi)存
  • 我們知道當多進程在內(nèi)存中共存時,如果內(nèi)存足夠大都夠用,大家相安無事自然是最理想的事了.不過現(xiàn)實往往沒那么美好.有些時候內(nèi)存會滿了,不夠用了.此時必須將進程從內(nèi)存移到硬盤中去.有空間時可能又會被移回內(nèi)存來.專業(yè)點的說法叫 滾出(roll-out),滾進(roll-in).或者叫換出,換入.

    ?

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

    (1)以進程為單位換出換進,這是最簡單最容易想到的.但是顯然不夠靈活,因為一個進程所需的內(nèi)存空間較大.所以這種交換技術(shù)現(xiàn)在用的不多

    (2)只交換進程的一部分. 通過頁式或段式內(nèi)存管理先把進程的虛擬地址空間劃分為若干頁面或段,這樣交換時就可就交換頁或段.

    ?

    頁式存儲管理

    所謂分頁就是把進程的虛擬地址空間劃分成大小均勻的一頁頁的(實際上就是一塊塊的,把進程切成幾小塊罷了),比如一頁是1K,然后把物理內(nèi)存也劃分成一頁頁的.然后再把兩者映射起來.如下圖.哎發(fā)現(xiàn)有時說一堆話學不如一個圖頂用,下面的圖都是我們從別處拷來的,圖片原地址http://www.doc88.com/p-982340562158.html

    ?

    當然這個映射關(guān)系的信息肯定要保存在哪.都保存在寄存器中.然后通過邏輯地址找物理地址的流程如下圖

    ?

    ?

    ?

    段式存儲管理

    分頁時,就是不管三七二十一,都一刀切,把程序切成均勻的一頁頁的.但我們知道程序?qū)嶋H運轉(zhuǎn)時是成為很多模塊的,比如一個函數(shù)可能是一個模塊.如果按程序的邏輯結(jié)構(gòu)來分成更小的組成部分可能更合理.因為程序執(zhí)行時也可以那樣分成一個個小的單位去執(zhí)行的嘛.這里我們把程序的更小單位叫作業(yè)

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

    ?

    邏輯地址與物理地址轉(zhuǎn)換如下圖

    ?

    ?

    ?

    分頁與分段結(jié)合

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

    于是有人想著把這兩種方法結(jié)合起來,叫段頁式存儲管理.你要以在一段內(nèi)再使用分頁技術(shù)

    ?

    ?

    虛擬內(nèi)存

    我們以前講了在32的windows上,每個程序運行時都會分配2G的虛擬地址空間.就算你調(diào)大的話也最多就3G.從這句話里我們可以延伸出這樣一些結(jié)論.

    1.由于32的系統(tǒng)尋址空間只有4G,所以你整個大于4G的內(nèi)存完全是浪費資源.系統(tǒng)只會用到其中的4G,多出來的根本不會去用.

    2.你可能想著每個進程都是2G的虛擬地址空間,那一個進程加載進內(nèi)存豈不是會把內(nèi)存塞滿了啊.實際上不會的,因為一來嘛分配給你2G地址空間.你不一定用這么多,可能只用10M,這樣加載到內(nèi)存的時候只加載你實際用的.另外就是不會一次把所有進程需要的內(nèi)存分配下來然后把程序加載進來,而只是加載暫時需要的程序代碼或數(shù)據(jù)

    3.因為每個進程地址空間最大也只能整個3G出來.所以如果你的進程一跑時需要4G的地址空間才夠用.那你的電腦肯定沒法支持的.所以如果一些大型游戲需要內(nèi)存特別多,你32的系統(tǒng)不管怎么整就玩不了.

    ?

    另外你就肯定會有疑問.?過去個幾年我們買電腦時貌似內(nèi)存很多都512M,1G就算多了.然后嘛基本是32的系統(tǒng).那如果某個程序?qū)嶋H有用到1G內(nèi)存咋整? 因為雖然說程序中分配時是用的虛擬地址空間,但如果你在那2G的虛擬地址空間中實際有用到1G,最后就要映射到實際內(nèi)存中去的啊.而且你1G的內(nèi)存地址可是不能出現(xiàn)重復.這樣那512內(nèi)存肯定不夠用的.

    后面就出現(xiàn)了個虛擬內(nèi)存的概念.就是劃出一部分硬盤來當作內(nèi)存用.當在虛擬內(nèi)存空間中實際用到的內(nèi)存大于物理內(nèi)存時需要用到虛擬內(nèi)存.在windows中可以在Advanced system settings那里面去設置虛擬內(nèi)存的大小.不管如果是32位的話虛擬內(nèi)存加上實際內(nèi)存肯定也不能大于4G,不然多出來的那部分也是沒有用處的.

    假如還是上面的例子,512M內(nèi)存,然后有1G的進程.你于是可以弄個1G的虛擬內(nèi)存.然后映射的時候,先在實際的內(nèi)存中映射,可能除開系統(tǒng)需要的一部分外就剩下300了.于是就先映射這300的內(nèi)存,剩下的再去虛擬內(nèi)存中映射.

    反正你的用的時候只要發(fā)個邏輯地址過去.剩下的事就不用管,操作系統(tǒng)有個MMU(memory management unit),里面會有個頁表.反正你輸入邏輯地址它最終給你轉(zhuǎn)換成物理內(nèi)存地址或硬盤地址.

    至于具體細節(jié)比較麻煩的.大概思路是,進程一般會采取分頁技術(shù),分成大小一樣的很多頁,每頁有編號.然后頁表里面會把你每頁對應內(nèi)存中具體的一塊內(nèi)存.當超過那300的實際上就對應于虛擬內(nèi)存中去了.(實際上就是硬盤上的一個swp文件),肯定也有標志信息表明這部分是在硬盤上. 于是當進程運行起來時,需要用到某個地址時就映射到虛擬內(nèi)存中時就會出現(xiàn)所謂的缺頁,那頁不在內(nèi)存中嘛,于是就需要去硬盤上把數(shù)據(jù)讀進內(nèi)存來,如果內(nèi)存滿了就需要置換出去一些頁. 所以你設置了虛擬內(nèi)存,最后如果真的會有用到,那你會看到硬盤轉(zhuǎn)的很快,然后程序運行速度會變慢.硬盤的操作比內(nèi)存慢很多

    總結(jié)

    以上是生活随笔為你收集整理的深入理解内存(3):内存交换技术,虚拟内存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。