內(nèi)存管理——虛擬內(nèi)存

張嘉倪

現(xiàn)代操作系統(tǒng)都使用了虛擬內(nèi)存系統(tǒng)來(lái)進(jìn)行內(nèi)存管理

1. 進(jìn)程直接訪問(wèn)物理內(nèi)存造成的問(wèn)題

早期的操作系統(tǒng)撑教,進(jìn)程直接訪問(wèn)物理內(nèi)存吨灭,存在以下問(wèn)題

  • 內(nèi)存不足
    當(dāng)進(jìn)程訪問(wèn)的內(nèi)存地址超出物理內(nèi)存范圍時(shí)吴叶,內(nèi)存不足煤率,程序會(huì)崩潰剃毒。
    舉個(gè)例子,32位CPU的系統(tǒng)纠亚,地址線為32條,可以訪問(wèn)的尋址空間為 2^{32}=4GB筋夏,如果機(jī)器只有1GB內(nèi)存蒂胞,當(dāng)進(jìn)程訪問(wèn)一個(gè)超過(guò) 1GB 范圍的內(nèi)存地址時(shí),程序崩潰条篷。
  • 內(nèi)存碎片化
    程序頻繁啟動(dòng)和退出骗随,會(huì)導(dǎo)致內(nèi)存的頻繁申請(qǐng)和釋放岳瞭,進(jìn)而產(chǎn)生內(nèi)存碎片,當(dāng)進(jìn)行內(nèi)存分配申請(qǐng)時(shí)蚊锹,有可能沒(méi)有任何一塊連續(xù)的內(nèi)存區(qū)域足夠大瞳筏,而導(dǎo)致分配失敗,盡管有足夠多的碎片牡昆,總量超過(guò)申請(qǐng)量姚炕。
  • 內(nèi)存訪問(wèn)沖突
    多個(gè)進(jìn)程可能訪問(wèn)相同的物理內(nèi)存地址,造成數(shù)據(jù)誤修改丢烘、錯(cuò)亂等柱宦。因?yàn)檫M(jìn)程并不知道哪些內(nèi)存被占用了。
    如何解決上述這些問(wèn)題呢播瞳?操作系統(tǒng)引入了虛擬內(nèi)存系統(tǒng)來(lái)解決掸刊。

2. 什么是虛擬內(nèi)存

基于以上問(wèn)題,操作系統(tǒng)使用了虛擬內(nèi)存的技術(shù)方案來(lái)進(jìn)行進(jìn)程見(jiàn)內(nèi)存管理赢乓∮遣啵可以理解成進(jìn)程和物理內(nèi)存之間的一層映射或容器,進(jìn)程使用虛擬內(nèi)存地址牌芋,也叫邏輯地址蚓炬,被MMU硬件單元(Memory Manager Unit)映射到對(duì)應(yīng)的物理內(nèi)存地址。我們可以看看虛擬內(nèi)存系統(tǒng)是如何解決上述的直接訪問(wèn)物理內(nèi)存的問(wèn)題躺屁?

虛擬內(nèi)存

  • 解決內(nèi)存不足
    當(dāng)進(jìn)程申請(qǐng)內(nèi)存肯夏,發(fā)現(xiàn)物理內(nèi)存不足時(shí),系統(tǒng)會(huì)根據(jù)頁(yè)面置換算法把暫時(shí)不用的內(nèi)存置換到硬盤(pán)上犀暑,并把對(duì)應(yīng)的邏輯地址映射到硬盤(pán)驯击,而把釋放出來(lái)的物理內(nèi)存返回給最新的進(jìn)程,并維護(hù)該邏輯地址到物理地址的映射關(guān)系耐亏,產(chǎn)生一種無(wú)限內(nèi)存的錯(cuò)覺(jué)徊都。
  • 解決內(nèi)存碎片
    虛擬內(nèi)存系統(tǒng)映射表可以找到多塊物理內(nèi)存碎片合并到一個(gè)邏輯塊中。
  • 內(nèi)存訪問(wèn)沖突
    不同進(jìn)程相同的虛擬地址苹熏,但是每個(gè)進(jìn)程有自己的映射表碟贾,通常會(huì)映射到不同的物理內(nèi)存,不會(huì)互相干擾轨域。

有些情況下袱耽,進(jìn)程間需要共享內(nèi)存,那么就是不同進(jìn)程的虛擬地址可以映射到相同的物理地址即可干发。

3. 虛擬內(nèi)存的原理

3.1 內(nèi)存分段

最早的虛擬內(nèi)存管理方式為內(nèi)存分段的方式朱巨,在進(jìn)程啟動(dòng)時(shí),為進(jìn)程分配一塊連續(xù)的內(nèi)存枉长,劃分為代碼段冀续、數(shù)據(jù)段琼讽、棧段、堆段等部分洪唐,進(jìn)程維護(hù)一個(gè)段表钻蹬,記錄每個(gè)段在物理內(nèi)存的起始地址(段基地址)和該段的最大偏移(段界限),虛擬地址由段號(hào)和段內(nèi)偏移值組成凭需,在映射時(shí)问欠,根據(jù)段號(hào)從段表中查詢物理地址起始位置,再加上偏移值得到物理內(nèi)存地址

內(nèi)存分段

內(nèi)存分段容易導(dǎo)致兩個(gè)問(wèn)題

  • 物理內(nèi)存容易出現(xiàn)內(nèi)存碎片
  • 當(dāng)需要進(jìn)行內(nèi)存置換到硬盤(pán)時(shí)粒蜈,只能以段為單位顺献,導(dǎo)致內(nèi)存交換效率較低

3.2 內(nèi)存分頁(yè)

為了解決內(nèi)存分段方案中較大內(nèi)存碎片內(nèi)存交換空間大導(dǎo)致效率低的問(wèn)題,內(nèi)存分頁(yè)的方案被提出枯怖。該方案的主要做法是:

  • 將整個(gè)虛擬和物理內(nèi)存空間分成若干份固定尺寸的大小注整,每一份稱為一頁(yè),通常在 Linux 下度硝,每一頁(yè)大小為 4KB
  • 虛擬地址和物理地址通過(guò)頁(yè)表來(lái)進(jìn)行映射
    內(nèi)存分頁(yè)
3.2.1 如何解決內(nèi)存分段的大塊外部碎片肿轨?

內(nèi)存分頁(yè),最小的內(nèi)存分配單位為頁(yè)塘淑,通常要比段小的多萝招,頁(yè)之間不需要保證連續(xù),可以將多個(gè)不連續(xù)的頁(yè)組裝成一塊較大的內(nèi)存區(qū)域存捺,因此不會(huì)產(chǎn)生大塊的外部?jī)?nèi)存

3.2.2 如何解決內(nèi)存分段的內(nèi)存交換效率低問(wèn)題?

內(nèi)存分段在產(chǎn)生內(nèi)存 Swap Out 和 Swap In 到硬盤(pán)時(shí)曙蒸,都是以段為單位的捌治,通常較大,而內(nèi)存分頁(yè)可以以頁(yè)為單位纽窟,更小更精細(xì)肖油,在交換時(shí)的效率更高碑诉。

3.2.3 虛擬地址如何映射到物理地址

虛擬地址由頁(yè)號(hào)和業(yè)內(nèi)偏移量組成陶因,內(nèi)存中存放一份頁(yè)表,保存了虛擬頁(yè)和物理頁(yè)的對(duì)應(yīng)關(guān)系径密,根據(jù)虛擬地址中的虛擬頁(yè)號(hào)到頁(yè)表中讀取物理頁(yè)號(hào)审孽,再加上虛擬地址中的偏移量县袱,就能得到物理地址


地址映射
3.2.4 內(nèi)存分頁(yè)有什么缺陷嗎?

(1) 有內(nèi)部碎片
頁(yè)的大小固定為4KB佑力,當(dāng)程序分配的內(nèi)存需求小于 4KB 時(shí)式散,操作系統(tǒng)也要分配4KB,容易造成頁(yè)內(nèi)碎片

(2)頁(yè)表占用內(nèi)存較大
頁(yè)表本身也占用了內(nèi)存打颤,例如在 32 位環(huán)境下暴拄,虛擬地址空間為 4GB = 2^{32}漓滔,一個(gè)頁(yè)大小是 4KB = 2^{12},那么頁(yè)數(shù)為 2^{20}大約為 100 萬(wàn)頁(yè)乖篷,每個(gè)頁(yè)表項(xiàng)需要 4 個(gè)字節(jié)响驴,則需要 4MB 的空間來(lái)存儲(chǔ)頁(yè)表,每個(gè)進(jìn)程都有自己的一份頁(yè)表撕蔼,4MB 還是有點(diǎn)大了踏施,我們可以通過(guò)多級(jí)頁(yè)表 來(lái)減少頁(yè)表占用的內(nèi)存大小

3.3 段頁(yè)式管理

3.3.1 實(shí)現(xiàn)方式

分段和分頁(yè)并不是對(duì)立的,Linux 將兩種方式組合起來(lái)罕邀,得到段頁(yè)式內(nèi)存管理方案

  • 現(xiàn)將進(jìn)程內(nèi)存進(jìn)行分段畅形、每段有各自的邏輯意義
  • 再將每個(gè)段進(jìn)行分頁(yè)
  • 虛擬地址由段號(hào)、段內(nèi)頁(yè)號(hào)和頁(yè)內(nèi)偏移量組成
  • 每個(gè)進(jìn)程對(duì)應(yīng)一張段表诉探、每個(gè)段對(duì)應(yīng)一張頁(yè)表日熬,段表中的地址為頁(yè)表的起始地址、頁(yè)表中的地址為該頁(yè)的物理地址


    段頁(yè)式管理
3.3.2 地址映射

段頁(yè)式內(nèi)存的地址映射過(guò)程:

  • 從虛擬地址中取出段號(hào)肾胯,訪問(wèn)段表竖席,得到頁(yè)表起始地址
  • 從虛擬地址中取出段內(nèi)頁(yè)號(hào),訪問(wèn)對(duì)應(yīng)的頁(yè)表敬肚,得到物理頁(yè)號(hào)
  • 從虛擬地址中取出頁(yè)內(nèi)偏移毕荐,和物理頁(yè)號(hào)組合,得到物理地址

4. Linux 程序的內(nèi)存布局

4.1 用戶空間和內(nèi)核空間

Linux 系統(tǒng)將虛擬地址空間劃分為內(nèi)核空間和用戶空間艳馒,對(duì)于 32 位環(huán)境憎亚,低地址的 3G 為用戶空間,高地址 1G 為內(nèi)核空間


虛擬內(nèi)存空間

內(nèi)核空間和用戶空間的區(qū)別:

  • 進(jìn)程在用戶態(tài)時(shí)弄慰,只能訪問(wèn)用戶空間內(nèi)存
  • 進(jìn)程只有進(jìn)入內(nèi)核態(tài)時(shí)第美,才能訪問(wèn)內(nèi)核空間內(nèi)存
    雖然每個(gè)進(jìn)程都有各自獨(dú)立的虛擬內(nèi)存空間,但是 <font color=red>每個(gè)進(jìn)程的內(nèi)核地址陆爽,都關(guān)聯(lián)相同的物理內(nèi)存地址</font>
    進(jìn)程共享內(nèi)核物理空間

4.2 用戶空間分段

用戶空間內(nèi)存段

用戶空間被劃分成 6 種不同的內(nèi)存段

  • 代碼段:程序編譯后的可執(zhí)行代碼(指令)存放區(qū)域什往,在編譯時(shí)確定了,同一個(gè)程序在不同機(jī)器上慌闭、在同一個(gè)機(jī)器上的不同次運(yùn)行别威,同一個(gè)方法的入口地址都是確定的
  • 數(shù)據(jù)段:存放程序已初始化的靜態(tài)常量和全局變量
  • BSS 段:存放未初始化的靜態(tài)常量和全局變量
  • 堆:動(dòng)態(tài)分配的內(nèi)存區(qū)域,從低地址向高地址增長(zhǎng)驴剔,大小不固定
  • 棧:存放局部變量省古、函數(shù)調(diào)用上下文等,棧的大小在程序啟動(dòng)時(shí)就固定了仔拟,一般是 8MB衫樊,系統(tǒng)提供了參數(shù)可以修改
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子科侈,更是在濱河造成了極大的恐慌载佳,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臀栈,死亡現(xiàn)場(chǎng)離奇詭異蔫慧,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)权薯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)姑躲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人盟蚣,你說(shuō)我怎么就攤上這事黍析。” “怎么了屎开?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵阐枣,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我奄抽,道長(zhǎng)蔼两,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任逞度,我火速辦了婚禮额划,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘档泽。我一直安慰自己俊戳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布茁瘦。 她就那樣靜靜地躺著品抽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪甜熔。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天突倍,我揣著相機(jī)與錄音腔稀,去河邊找鬼。 笑死羽历,一個(gè)胖子當(dāng)著我的面吹牛焊虏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秕磷,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼诵闭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起疏尿,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瘟芝,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后褥琐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體锌俱,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年敌呈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贸宏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡磕洪,死狀恐怖吭练,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情析显,我是刑警寧澤鲫咽,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站叫榕,受9級(jí)特大地震影響浑侥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晰绎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一寓落、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荞下,春花似錦伶选、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至抽诉,卻和暖如春陨簇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背迹淌。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工河绽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人唉窃。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓耙饰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親纹份。 傳聞我的和親對(duì)象是個(gè)殘疾皇子苟跪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • 計(jì)算機(jī)系統(tǒng)虛擬內(nèi)存分享 前言 該分享文檔廷痘,是基于《深入理解理解計(jì)算機(jī)系統(tǒng)》第三版關(guān)于內(nèi)存方面的總結(jié)。下述所有模型圖...
    不想工作的iOS閱讀 745評(píng)論 0 5
  • 系統(tǒng)中的進(jìn)程與其他進(jìn)程共享CPU和主存件已。首先進(jìn)程多需要的內(nèi)存也多笋额,其次內(nèi)存易被破壞,如進(jìn)程A不小心寫(xiě)入進(jìn)程B使用的...
    進(jìn)擊的編程喵閱讀 409評(píng)論 0 0
  • 虛擬內(nèi)存的由來(lái) 為什么會(huì)出現(xiàn)虛擬內(nèi)存呢拨齐?這就要從最初的操作系統(tǒng)來(lái)說(shuō)起了鳞陨,最初的操作系統(tǒng)并沒(méi)有現(xiàn)在那么完善,剛開(kāi)始的...
    tracy_668閱讀 4,427評(píng)論 0 8
  • [TOC] 為什么不直接使用物理內(nèi)存 虛擬內(nèi)存是計(jì)算機(jī)系統(tǒng)內(nèi)存管理的一種技術(shù)瞻惋。它使得應(yīng)用程序認(rèn)為它擁有連續(xù)可用的內(nèi)...
    tracy_668閱讀 964評(píng)論 0 3
  • 背景 操作系統(tǒng)有虛擬內(nèi)存與物理內(nèi)存之分厦滤。在虛擬內(nèi)存出現(xiàn)之前,程序?qū)ぶ酚玫亩际俏锢淼刂芳呃牵虼顺绦蚰軐ぶ返姆秶怯邢薜?..
    呂信閱讀 5,363評(píng)論 0 5