《操作系統(tǒng)概念精要》之內(nèi)存篇(四)-虛擬內(nèi)存

經(jīng)過以前的學(xué)習(xí)湾碎,了解到了內(nèi)存的管理策略宙攻。不管是分頁,還是分段介褥,或者是頁表的管理策略座掘。這些都有一個(gè)共同的目標(biāo):將多個(gè)進(jìn)程都保存在內(nèi)存中,這一操作柔滔,都是為了保證在進(jìn)程啟動時(shí)溢陪,進(jìn)程處于內(nèi)存中。
但是虛擬內(nèi)存技術(shù)允許執(zhí)行進(jìn)程不必完全處于內(nèi)存廊遍。這就使得程序可以完全大于物理內(nèi)存,從而在開發(fā)的過程中贩挣,程序員不用擔(dān)心內(nèi)存的限制喉前。

基本概念

虛擬內(nèi)存:虛擬內(nèi)存可以是一種邏輯上擴(kuò)充物理內(nèi)存的技術(shù)。它會把進(jìn)程的邏輯地址空間進(jìn)行擴(kuò)展王财。(書中說的虛擬內(nèi)存卵迂,可以看做是假象的邏輯內(nèi)存,雖然在平常使用top 命令看到了虛擬內(nèi)存表示一些具體的物理實(shí)體绒净,但是而書上一直用虛擬內(nèi)存這個(gè)詞個(gè)人認(rèn)為不是很好 )见咒。
虛擬地址空間: 其實(shí)這里的虛擬地址空間 感覺還是可以用邏輯地址空間的概念來代替。它表示進(jìn)程在內(nèi)存中的邏輯地址范圍挂疆。

請求調(diào)頁

我們在把進(jìn)程加載到內(nèi)存的過程中改览, 并不是把進(jìn)程的所有執(zhí)行代碼都加載到內(nèi)存,而是在需要執(zhí)行的時(shí)候才加載進(jìn)內(nèi)存缤言,這種技術(shù)叫請求調(diào)頁宝当,常常用于虛擬內(nèi)存系統(tǒng)。
對于請求頁的邏輯內(nèi)存胆萧,頁面只有在程序執(zhí)行期間被請求時(shí)才被加載庆揩。因此,從未訪問的那些頁從不加載到物理內(nèi)存中。而這種交換的方式也被稱為 惰性交換订晌。

基本執(zhí)行過程:當(dāng)換入進(jìn)程時(shí)虏辫,調(diào)頁程序會猜測在該進(jìn)程被再次換出之前,會用到哪些頁锈拨。調(diào)頁程序不是調(diào)入整個(gè)進(jìn)程砌庄,而是把哪些要使用的頁調(diào)入內(nèi)存。從而減少交換時(shí)間推励,而且還能避免物理內(nèi)存空間的浪費(fèi)鹤耍。
具體實(shí)現(xiàn):在使用這種方案的時(shí)候,需要一定的硬件支持验辞。以區(qū)分內(nèi)存的頁面和磁盤的頁面稿黄。通常在頁面上會有一個(gè)保護(hù)位,它的最后一位就是用于提供這個(gè)功能的跌造。這個(gè)位是有效-無效位杆怕。
當(dāng)這個(gè)位被置為有效位時(shí), 相關(guān)的頁面是合法的壳贪,并且在內(nèi)存中陵珍。
當(dāng)這個(gè)位被置為無效位時(shí),頁面無效或者是有效但是在磁盤上违施。

有效-無效位的頁表.png

當(dāng)進(jìn)程在執(zhí)行過程中的時(shí)候互纯,如果訪問內(nèi)存駐留的頁面時(shí),會一切順利磕蒲。但是當(dāng)訪問到尚未調(diào)入的頁面的時(shí)候留潦,對,標(biāo)記為無效的頁面會產(chǎn)生缺頁錯(cuò)誤辣往。分頁硬件在通過頁表轉(zhuǎn)換地址時(shí)兔院,會發(fā)現(xiàn)無效位被設(shè)置,從而陷入操作系統(tǒng)站削。
一般缺頁錯(cuò)誤的處理很簡單:

  1. 檢查這個(gè)進(jìn)程的內(nèi)部表坊萝,以確認(rèn)該引用是有效的還是無效的內(nèi)存訪問。
  2. 如果引用無效许起,那么終止進(jìn)程十偶。如果引用有效但是沒有調(diào)入內(nèi)存,那么現(xiàn)在就調(diào)入园细。
  3. 找到一個(gè)空閑幀扯键。
  4. 調(diào)度一個(gè)磁盤操作,以將所需頁面讀到剛分配的幀珊肃。
  5. 磁盤讀取完成荣刑,修改進(jìn)程內(nèi)部表和頁表馅笙。以指示該頁現(xiàn)在處于內(nèi)存中。
  6. 重新啟動被陷入中斷的指令厉亏。該進(jìn)程能訪問所需要的頁面董习,就好像原來他就在內(nèi)存中一樣。
缺頁中斷處理.png

交換空間

在進(jìn)程執(zhí)行過程中爱只,需要一個(gè)輔助設(shè)備皿淋,用于保存不在內(nèi)存中的那么頁面。這種外存通常為高速硬盤恬试,稱為交換設(shè)備窝趣,用于交換的這部分磁盤叫做交換空間
請求調(diào)頁的中使用的交換空間的磁盤I/O 通常要快于文件系統(tǒng)的训柴。交換空間的文件系統(tǒng)更快哑舒,因?yàn)樗前锤蟮膲K來分配的。并且不采用文件查找和間接分配方法幻馁。
因此洗鸵,系統(tǒng)可以在進(jìn)程啟動時(shí),將整個(gè)文件映像復(fù)制到交換空間仗嗦,然后從交換空間執(zhí)行請求調(diào)頁膘滨,從而獲取到好的分頁吞吐量。
另一個(gè)選擇是開始時(shí)在文件系統(tǒng)進(jìn)行請求調(diào)頁稀拐,但是在置換頁面時(shí)將換出的頁面寫入交換空間火邓。這保證了后續(xù)的調(diào)頁都是從交換空間完成的。

寫時(shí)復(fù)制

在父進(jìn)程調(diào)用fork()創(chuàng)建子進(jìn)程時(shí)后德撬,我們曾說子進(jìn)程應(yīng)該創(chuàng)建一個(gè)父進(jìn)程地址空間的副本铲咨,復(fù)制屬于父進(jìn)程的頁面。然而考慮到了許多子進(jìn)程在創(chuàng)建之后立馬執(zhí)行了exec()函數(shù)替換了砰逻,所以復(fù)制父進(jìn)程的頁面可能沒有必要鸣驱。因此我們采用了寫時(shí)復(fù)制技術(shù)泛鸟。他通過允許父進(jìn)程和子進(jìn)程最初共享相同的頁面來進(jìn)行工作蝠咆。這些頁面是共享頁面,被標(biāo)記為寫時(shí)復(fù)制北滥,這意味著任何進(jìn)程寫入共享頁面刚操,那么就創(chuàng)建一個(gè)共享頁面的副本。

進(jìn)程1修改頁面C之前.png
進(jìn)程1修改頁面C之后.png

可以看到使用寫時(shí)復(fù)制技術(shù)再芋,僅復(fù)制任何一個(gè)進(jìn)程修改的頁面菊霜,所有未修改的頁面可以由父進(jìn)程和子進(jìn)程共享。
還要注意济赎,只有可以修改的頁面才需要標(biāo)記寫時(shí)復(fù)制鉴逞。不能修改的頁面可以父子共享(比如代碼段)记某。

在實(shí)現(xiàn)上,許多操作系統(tǒng)都為這類請求提供了一個(gè)空閑的頁面池(和個(gè)人認(rèn)為和內(nèi)存池差不多)构捡。當(dāng)進(jìn)程的堆椧耗希或者堆要進(jìn)行擴(kuò)展時(shí),或者有寫時(shí)復(fù)制的請求時(shí)勾徽,通常分配這里的空閑頁面滑凉。操作系統(tǒng)分配這些頁面通常采用按需填0的技術(shù)。以清理原來的內(nèi)存喘帚。
Linux 提供了 fork()的變種畅姊,vfork()。vfork()的操作不同于寫時(shí)復(fù)制的fork()吹由。它會將父進(jìn)程掛起若未,子進(jìn)程使用父進(jìn)程的地址空間。
由于vfork()不會發(fā)生寫時(shí)復(fù)制溉知,所以他的修改的頁面在父進(jìn)程中是可以看到的陨瘩。當(dāng)子進(jìn)程在創(chuàng)建后立即會被exec()的情況下,可以使用vfork()级乍。因?yàn)樗麄冇袕?fù)制頁面舌劳,可以高效的啟動新進(jìn)程。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末玫荣,一起剝皮案震驚了整個(gè)濱河市甚淡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捅厂,老刑警劉巖贯卦,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異焙贷,居然都是意外死亡撵割,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門辙芍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啡彬,“玉大人,你說我怎么就攤上這事故硅∈樱” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵吃衅,是天一觀的道長往踢。 經(jīng)常有香客問我,道長徘层,這世上最難降的妖魔是什么峻呕? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任利职,我火速辦了婚禮,結(jié)果婚禮上瘦癌,老公的妹妹穿的比我還像新娘眼耀。我一直安慰自己,他們只是感情好佩憾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布哮伟。 她就那樣靜靜地躺著,像睡著了一般妄帘。 火紅的嫁衣襯著肌膚如雪楞黄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天抡驼,我揣著相機(jī)與錄音鬼廓,去河邊找鬼。 笑死致盟,一個(gè)胖子當(dāng)著我的面吹牛碎税,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播馏锡,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼雷蹂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了杯道?” 一聲冷哼從身側(cè)響起匪煌,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎党巾,沒想到半個(gè)月后萎庭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡齿拂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年驳规,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片署海。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吗购,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出叹侄,到底是詐尸還是另有隱情巩搏,我是刑警寧澤昨登,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布趾代,位于F島的核電站,受9級特大地震影響丰辣,放射性物質(zhì)發(fā)生泄漏撒强。R本人自食惡果不足惜禽捆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望飘哨。 院中可真熱鬧胚想,春花似錦、人聲如沸芽隆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胚吁。三九已至牙躺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腕扶,已是汗流浹背孽拷。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留半抱,地道東北人脓恕。 一個(gè)月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像窿侈,于是被迫代替她去往敵國和親炼幔。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353