虛擬內(nèi)存機(jī)制

在早期的計算機(jī)中蒋荚,是沒有虛擬內(nèi)存的概念的。我們要運行一個程序腐缤,會把程序全部裝入內(nèi)存喷橙,然后運行。
會出現(xiàn)以下問題:
1)進(jìn)程地址空間不隔離,沒有權(quán)限保護(hù)。
直接訪問物理內(nèi)存,可修改其他進(jìn)程的內(nèi)存數(shù)據(jù)泛豪。
2)內(nèi)存使用效率低。
大量數(shù)據(jù)的裝入裝出侦鹏。
3)程序運行的地址不確定诡曙。
內(nèi)存地址隨機(jī)分。

虛擬內(nèi)存的作用:

1)給所有進(jìn)程提供一致的地址空間略水,每個進(jìn)程都認(rèn)為自己是在獨占使用單機(jī)系統(tǒng)的存儲資源价卤。可以控制物理內(nèi)存的權(quán)限聚请。
2)內(nèi)存保護(hù):保護(hù)每個進(jìn)程的地址空間不被其他進(jìn)程破壞荠雕,隔離了進(jìn)程的地址訪問。
3)根據(jù)緩存原理驶赏,上層存儲是下層存儲的緩存炸卑,虛擬內(nèi)存把主存作為磁盤的高速緩存,在主存和磁盤之間根據(jù)需要來回傳送數(shù)據(jù)煤傍,高效地使用了主存盖文。
4)VA到PA的映射會給分配和釋放內(nèi)存帶來方便。物理內(nèi)存不連續(xù)的地址蚯姆,可映射到連續(xù)的虛擬內(nèi)存地址五续。

虛擬內(nèi)存機(jī)制的優(yōu)點
  • 擴(kuò)大地址空間;
  • 內(nèi)存保護(hù):每個進(jìn)程運行在各自的虛擬內(nèi)存地址空間龄恋,互相不能干擾對方疙驾。
  • 每個進(jìn)程的內(nèi)存空間都是一致而且固定的(32位平臺下都是4G),所以鏈接器在鏈接可執(zhí)行文件時郭毕,可以設(shè)定內(nèi)存地址它碎,而不用去管這些數(shù)據(jù)最終實際內(nèi)存地址,這交給內(nèi)核來完成映射關(guān)系
  • 當(dāng)不同的進(jìn)程使用同一段代碼時显押,比如庫文件的代碼扳肛,在物理內(nèi)存中可以只存儲一份這樣的代碼,不同進(jìn)程只要將自己的虛擬內(nèi)存映射過去就好了乘碑,這樣可以節(jié)省物理內(nèi)存
  • 在程序需要分配連續(xù)空間的時候挖息,只需要在虛擬內(nèi)存分配連續(xù)空間,而不需要物理內(nèi)存時連續(xù)的兽肤,實際上套腹,往往物理內(nèi)存都是斷斷續(xù)續(xù)的內(nèi)存碎片绪抛。這樣就可以有效地利用我們的物理內(nèi)存
  • 虛擬內(nèi)存很適合在多道程序設(shè)計系統(tǒng)中使用,許多程序的片段同時保存在內(nèi)存中电禀。當(dāng)一個程序等待它的一部分讀入內(nèi)存時睦疫,可以把CPU交給另一個進(jìn)程使用。在內(nèi)存中可以保留多個進(jìn)程鞭呕,系統(tǒng)并發(fā)度提高。
虛擬內(nèi)存的代價:

1.虛存的管理需要建立很多數(shù)據(jù)結(jié)構(gòu)宛官,這些數(shù)據(jù)結(jié)構(gòu)要占用額外的內(nèi)存

2.虛擬地址到物理地址的轉(zhuǎn)換葫松,增加了指令的執(zhí)行時間。

3.頁面的換入換出需要磁盤I/O底洗,這是很耗時的

4.如果一頁中只有一部分?jǐn)?shù)據(jù)腋么,會浪費內(nèi)存。

虛擬地址:

對于32位系統(tǒng)亥揖,尋址指針為4字節(jié)珊擂,對應(yīng)的虛擬地址空間為0-2^32,即0-4G费变。
對于64位系統(tǒng)摧扇,尋址指針為8字節(jié),對應(yīng)的虛擬地址空間為0-2^64挚歧,即0-16G扛稽。不是實際存在的。
Linux內(nèi)核把虛擬地址空間分為兩部分:用戶進(jìn)程空間滑负,內(nèi)核進(jìn)程空間在张。

虛擬內(nèi)存

在緩存原理中,換入/換出的數(shù)據(jù)以為最小單位矮慕。在內(nèi)存管理時帮匾,是地址空間的最小單位。

虛擬地址到物理地址的轉(zhuǎn)換

進(jìn)程得到的這4G虛擬內(nèi)存是一個連續(xù)的地址空間(這也只是進(jìn)程認(rèn)為)痴鳄,而實際上瘟斜,它通常是被分隔成多個物理內(nèi)存碎片,還有一部分存儲在外部磁盤存儲器上夏跷,在需要時進(jìn)行數(shù)據(jù)交換哼转。

進(jìn)程開始要訪問一個地址,經(jīng)歷下面的過程
  1. 訪問地址空間上的某一個地址槽华,都需要把地址翻譯為實際物理內(nèi)存地址壹蔓;
  2. 所有進(jìn)程共享這整一塊物理內(nèi)存,每個進(jìn)程只把自己目前需要的虛擬地址空間映射到物理內(nèi)存上猫态;
  3. 進(jìn)程需要知道哪些地址空間上的數(shù)據(jù)在物理內(nèi)存上佣蓉,哪些不在(可能這部分存儲在磁盤上)披摄,還有在物理內(nèi)存上的哪里,這就需要通過頁表來記錄勇凭;
  4. 頁表的每一個表項分兩部分疚膊,第一部分記錄此頁是否在物理內(nèi)存上,第二部分記錄物理內(nèi)存頁的地址(如果在的話)虾标;
  5. 當(dāng)進(jìn)程訪問某個虛擬地址的時候寓盗,就會先去看頁表,如果發(fā)現(xiàn)對應(yīng)的數(shù)據(jù)不在物理內(nèi)存上璧函,就會發(fā)生缺頁異常傀蚌;
  6. 缺頁異常的處理過程,操作系統(tǒng)立即阻塞該進(jìn)程蘸吓,并將硬盤里對應(yīng)的頁換入內(nèi)存善炫,然后使該進(jìn)程就緒,如果內(nèi)存已經(jīng)滿了库继,沒有空地方了箩艺,那就找一個頁覆蓋,至于具體覆蓋的哪個頁宪萄,就需要看操作系統(tǒng)的頁面置換算法是怎么設(shè)計的了艺谆。

虛擬內(nèi)存是怎么工作的

當(dāng)每個進(jìn)程創(chuàng)建的時候,內(nèi)核會為進(jìn)程分配4G的虛擬內(nèi)存拜英,當(dāng)進(jìn)程還沒有開始運行時擂涛,這只是一個內(nèi)存布局。實際上并不立即就把虛擬內(nèi)存對應(yīng)位置的程序數(shù)據(jù)和代碼(比如.text .data段)拷貝到物理內(nèi)存中聊记,只是建立好虛擬內(nèi)存和磁盤文件之間的映射就好(叫做存儲器映射)撒妈。這個時候數(shù)據(jù)和代碼還是在磁盤上的。當(dāng)運行到對應(yīng)的程序時排监,進(jìn)程去尋找頁表狰右,發(fā)現(xiàn)頁表中地址沒有存放在物理內(nèi)存上,而是在磁盤上舆床,于是發(fā)生缺頁異常棋蚌,于是將磁盤上的數(shù)據(jù)拷貝到物理內(nèi)存中。

另外在進(jìn)程運行過程中挨队,要通過malloc來動態(tài)分配內(nèi)存時谷暮,也只是分配了虛擬內(nèi)存,即為這塊虛擬內(nèi)存對應(yīng)的頁表項做相應(yīng)設(shè)置盛垦,當(dāng)進(jìn)程真正訪問到此數(shù)據(jù)時湿弦,才引發(fā)缺頁異常

可以認(rèn)為虛擬空間都被映射到了磁盤空間中(事實上也是按需要映射到磁盤空間上腾夯,通過mmap颊埃,mmap是用來建立虛擬空間和磁盤空間的映射關(guān)系的)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔬充,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子班利,更是在濱河造成了極大的恐慌饥漫,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罗标,死亡現(xiàn)場離奇詭異庸队,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)闯割,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門皿哨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纽谒,你說我怎么就攤上這事∪缡洌” “怎么了鼓黔?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長不见。 經(jīng)常有香客問我澳化,道長,這世上最難降的妖魔是什么稳吮? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任缎谷,我火速辦了婚禮,結(jié)果婚禮上灶似,老公的妹妹穿的比我還像新娘列林。我一直安慰自己,他們只是感情好酪惭,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布希痴。 她就那樣靜靜地躺著,像睡著了一般春感。 火紅的嫁衣襯著肌膚如雪砌创。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天鲫懒,我揣著相機(jī)與錄音嫩实,去河邊找鬼。 笑死窥岩,一個胖子當(dāng)著我的面吹牛甲献,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播颂翼,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼竟纳,長吁一口氣:“原來是場噩夢啊……” “哼撵溃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锥累,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤缘挑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后桶略,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體语淘,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年际歼,在試婚紗的時候發(fā)現(xiàn)自己被綠了惶翻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡鹅心,死狀恐怖吕粗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情旭愧,我是刑警寧澤颅筋,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站输枯,受9級特大地震影響议泵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桃熄,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一先口、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瞳收,春花似錦碉京、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至血崭,卻和暖如春卧惜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背夹纫。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工咽瓷, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舰讹。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓茅姜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子钻洒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

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

  • 概述 現(xiàn)代操作系統(tǒng)了提供了一種對主存的抽象概念奋姿,叫做虛擬內(nèi)存。它為每個進(jìn)程提供了一個非常大的素标,一致的和私有的地址空...
    要上班的斌哥閱讀 16,392評論 2 55
  • Linux內(nèi)存管理涉及的面比較廣泛而且比較復(fù)雜称诗,這里只抽取部分知識來講解 一 早期的內(nèi)存分配機(jī)制 在早期的計算機(jī)中...
    cj3479閱讀 1,916評論 0 0
  • 本文轉(zhuǎn)載自 https://juejin.im/post/59f8691b51882534af254317 參考:...
    xingdong閱讀 2,711評論 0 3
  • >計算機(jī)系統(tǒng)中有幾類存儲設(shè)備:cache、內(nèi)存头遭、外存寓免。cache的存取速度最高,可以和CPU匹配计维,因此其代價最高袜香,...
    一生信仰閱讀 1,131評論 0 0
  • 內(nèi)存是程序得以運行的基礎(chǔ),如何在有限的內(nèi)存空間中運行較大的應(yīng)用程序鲫惶,曾經(jīng)是一個難題蜈首,為了解決這個問題設(shè)計了許多方案...
    JunChow520閱讀 9,350評論 0 11