Linux內(nèi)存管理-虛擬內(nèi)存篇

介紹

  • 虛擬內(nèi)存是現(xiàn)代所有的操作系統(tǒng)支持的一個(gè)核心功能惨好。雖然內(nèi)存的容量增長快速,但
    是軟件的大小增長更快。這一發(fā)展的最終結(jié)果就是需要運(yùn)行的程序會有可能大到內(nèi)存
    無法容納忽舟,而且必然需要系統(tǒng)能夠支持多個(gè)程序的同時(shí)運(yùn)行双妨,即使內(nèi)存可以滿足其中
    單一程序的需要,總體來看可能仍然會超出內(nèi)存的大小叮阅。早期出現(xiàn)了覆蓋技術(shù)刁品,思想
    是把程序分割成許多片段,每個(gè)片段就是一個(gè)覆蓋序列.在程序開始執(zhí)行時(shí),將覆蓋管理
    模塊載入內(nèi)存,該覆蓋管理模塊立即裝入并運(yùn)行序列0.執(zhí)行完,序列0就通知覆蓋管理模
    塊載入序列1,如果有多余的空間就占用序列0的上方位置,沒有則占用序列0.覆蓋塊存
    放在磁盤中,在需要時(shí),由操作系統(tǒng)換入換出.這樣看起來好像沒有太大的問題,因?yàn)槭?br> 由操作系統(tǒng)來進(jìn)行換入換出.但是應(yīng)用程序需要被分割成多個(gè)片段.把一個(gè)大的程序分
    割成小的浩姥、模塊化的片段是非常耗時(shí)和枯燥的,并且容易出錯(cuò).而且這個(gè)事要交給程序
    員去做,那估計(jì)要崩潰了.沒過多久聰明的人類就找到了解決版本,提出了虛擬內(nèi)存的
    概念.

  • 虛擬內(nèi)存的基本思想是:每個(gè)程序都擁有自己的地址空間,這個(gè)空間被分成多個(gè)塊,
    每個(gè)塊叫做一個(gè)頁或一個(gè)頁面.每一頁有連續(xù)的地址范圍.這些頁被映射到物理內(nèi)存,
    但并不是所有的頁必須在內(nèi)存中才能運(yùn)行程序.當(dāng)程序引用到一部分在物理內(nèi)存中
    的地址空間時(shí),由硬件立刻執(zhí)行必要的映射.當(dāng)程序引用到一部分不在物理內(nèi)存中的
    地址空間時(shí),再由操作系統(tǒng)負(fù)責(zé)將缺失的部分裝入物理內(nèi)存并重新執(zhí)行失敗的命令,
    這個(gè)過程叫缺頁中斷處理處理. 虛擬內(nèi)存很適合在多道程序設(shè)計(jì)系統(tǒng)中使用,許多
    程序的片段同時(shí)保存在內(nèi)存中. 當(dāng)一個(gè)程序等待它的一部分讀入內(nèi)存時(shí),可以把CPU
    交給另一個(gè)程序使用. 這里解釋一下什么是多道程序設(shè)計(jì)系統(tǒng),所謂的多道程序設(shè)
    計(jì)系統(tǒng)指的是允許多個(gè)程序同時(shí)進(jìn)入一個(gè)計(jì)算機(jī)系統(tǒng)的主存儲器(即內(nèi)存)并啟動進(jìn)
    行計(jì)算的方法.也就是說,計(jì)算機(jī)內(nèi)存中可以同時(shí)存放多個(gè)(兩個(gè)或以上相互獨(dú)立的)
    正在運(yùn)行的程序,它們都處于開始和結(jié)束之間.從宏觀上看是并行的,多道程序都處
    于運(yùn)行中,并且都沒有運(yùn)行結(jié)束;從微觀上看是串行的,各道程序輪流使用CPU,交替
    執(zhí)行.引入多道程序設(shè)計(jì)技術(shù)的根本目的是為了提高CPU的利用率,充分發(fā)揮計(jì)算機(jī)
    系統(tǒng)部件的并行性,現(xiàn)代計(jì)算機(jī)系統(tǒng)都采用了多道程序設(shè)計(jì)技術(shù).

  • 程序在訪問一個(gè)內(nèi)存地址指向的內(nèi)存時(shí),CPU不是直接把這個(gè)地址送到內(nèi)存總線
    上,而是被送到一個(gè)叫內(nèi)存管理單元的硬件上(業(yè)界也叫MMU,是Memory Management
    Unit的簡稱),然后由這個(gè)硬件把這個(gè)內(nèi)存地址映射到實(shí)際的物理內(nèi)存地址上.程序
    操作的這個(gè)地址稱為虛擬內(nèi)存地址.MMU作為CPU芯片的一部分,其實(shí)是單獨(dú)的一個(gè)
    芯片.MMU把虛擬內(nèi)存地址映射成物理內(nèi)存地址再送到總線的過程如下圖:


    mmu-convert01-1.jpg

分頁技術(shù)

  • 上面提到了虛擬內(nèi)存地址,實(shí)際上程序所訪問的這些內(nèi)存地址,構(gòu)成了一個(gè)虛擬
    地址空間,正如上面提到的,虛擬地址空間按照固定的大小被劃分成若干單元,每
    個(gè)單元叫做一個(gè)頁或者一個(gè)頁面.同時(shí)實(shí)際的物理內(nèi)存也被劃分成若干單元,但是
    物理內(nèi)存對應(yīng)的這個(gè)單元被業(yè)界稱作Page Frame(頁幀或頁框).虛擬內(nèi)存的頁面
    和物理內(nèi)存的頁框通常是一樣大的,比如都是4KB或者2MB,實(shí)際的頁面大小可能從
    512 byte到1GB.如下圖,按每頁4KB劃分一個(gè)32KB的物理內(nèi)存空間和一個(gè)64KB的虛
    擬地址空間,可得到8個(gè)頁框和16個(gè)虛擬頁面.內(nèi)存和磁盤之間的交換總是以整個(gè)
    頁面為單元進(jìn)行的.


    mmu-convert02.jpg

    結(jié)合這兩個(gè)圖,下面簡單的解釋一下:
    當(dāng)程序試圖訪問地址0時(shí),如執(zhí)行下面的指令:

    MOV REG, 0

這句偽代碼的意思是把地址0的數(shù)據(jù)送入寄存器中,REG是register的簡稱,
表示寄存器.但并不是真實(shí)的寄存器的名字,這里是偽代碼.真實(shí)的寄存器如
AX,BX,CX,SS,SP等.

將虛擬地址0送到MMU,MMU看到虛擬地址0落在(0~4095)這個(gè)頁面上,而這個(gè)頁面
被映射到2(8K~12K)這個(gè)頁框上,所以MMU把地址變成8192,并把地址8192送到總
線上.內(nèi)存對MMU一無所知.它只看到一個(gè)對地址8192的讀或?qū)懻埱蟛?zhí)行它.
同理:

    MOV REG, 8192

被轉(zhuǎn)換成

    MOV REG, 24576

頁面8192被映射到第6個(gè)頁框上即 1024 x 24 = 24576
上面的圖中因?yàn)橹挥?個(gè)物理頁框的內(nèi)存,所以只有8個(gè)頁面被映射到了物理內(nèi)存
,正如圖上有頁框號的頁面,其他的頁面上都是叉號,表示沒有被映射到物理內(nèi)存
.在實(shí)際的硬件中,是用一個(gè)標(biāo)志位("在/不在")來記錄頁面是否被映射到物理內(nèi)
存.如0表示當(dāng)前頁沒有被映射,1表示被映射.
再如,當(dāng)程序訪問了一個(gè)沒有被映射的頁面:

    MOV REG, 24576

MMU注意到該頁面沒有被映射,于是CPU通知操作系統(tǒng),出現(xiàn)了上面提到的缺頁錯(cuò)
誤或缺頁異常.操作系統(tǒng)找到一個(gè)很少使用的頁框,且把它的內(nèi)容寫入磁盤.然
后把需要訪問的這個(gè)頁面的內(nèi)容讀到剛才的頁框里,修改一下映射關(guān)系,然后重
新執(zhí)行剛才的異常指令.這個(gè)過程就叫缺頁中斷處理.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枫笛,一起剝皮案震驚了整個(gè)濱河市莺葫,隨后出現(xiàn)的幾起案子袍暴,更是在濱河造成了極大的恐慌帕棉,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)柒桑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來噪舀,“玉大人魁淳,你說我怎么就攤上這事∮氤” “怎么了界逛?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蒸走。 經(jīng)常有香客問我仇奶,道長,這世上最難降的妖魔是什么比驻? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任该溯,我火速辦了婚禮,結(jié)果婚禮上别惦,老公的妹妹穿的比我還像新娘狈茉。我一直安慰自己,他們只是感情好掸掸,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布氯庆。 她就那樣靜靜地躺著,像睡著了一般扰付。 火紅的嫁衣襯著肌膚如雪堤撵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天羽莺,我揣著相機(jī)與錄音实昨,去河邊找鬼。 笑死盐固,一個(gè)胖子當(dāng)著我的面吹牛荒给,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播刁卜,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼志电,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蛔趴?” 一聲冷哼從身側(cè)響起挑辆,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后之拨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茉继,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年蚀乔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菲茬。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吉挣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出婉弹,到底是詐尸還是另有隱情睬魂,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布镀赌,位于F島的核電站氯哮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏商佛。R本人自食惡果不足惜喉钢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望良姆。 院中可真熱鬧肠虽,春花似錦、人聲如沸玛追。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痊剖。三九已至韩玩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陆馁,已是汗流浹背找颓。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氮惯,地道東北人叮雳。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像妇汗,于是被迫代替她去往敵國和親帘不。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1. 基礎(chǔ)知識 1.1杨箭、 基本概念寞焙、 功能 馮諾伊曼體系結(jié)構(gòu)1、計(jì)算機(jī)處理的數(shù)據(jù)和指令一律用二進(jìn)制數(shù)表示2、順序執(zhí)...
    yunpiao閱讀 5,266評論 1 22
  • 一捣郊、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡單分配策略的問題地址空間不隔離內(nèi)存使用效率低程序運(yùn)行的地址不確定 關(guān)于...
    SeanCST閱讀 7,784評論 0 27
  • 概述 我們都知道一個(gè)進(jìn)程是與其他進(jìn)程共享CPU和內(nèi)存資源的辽狈。正因如此,操作系統(tǒng)需要有一套完善的內(nèi)存管理機(jī)制才能防止...
    SylvanasSun閱讀 3,834評論 0 25
  • 1 內(nèi)存尋址 1.1 物理地址呛牲、虛擬地址以及線性地址 物理地址: 物理內(nèi)存的內(nèi)存單元地址 虛擬地址: 程序員看到的...
    瘋狂小王子閱讀 2,793評論 3 21
  • 什么都知道一點(diǎn)刮萌,但都不甚了解。是最可怕的娘扩,他會讓你以為自己很牛逼了
    zgo閱讀 208評論 0 0