iT邦幫忙

0

【小黑馬作業系統教室】(12) (Ch9)虛擬記憶體(virtual memory),作業系統的「偷天換日大法」

大家好,我是心原一馬,
從前對作業系統的了解還不夠深時,
小馬寫了一個系列文【小白馬的OS筆記】,
為了完善作業系統的筆記,將【小白馬的OS筆記】(7)的內容整理過來。

上一篇: 【小黑馬作業系統教室】(11) (Ch8)記憶體管理的碎片-fragmentation,segmentation是解方?

這邊給個重點提示,
如果說作業系統第八章講的是記憶體的地址轉換,
那麼第九章講的則是記憶體(memory)與磁碟(disk)之間的互動了。

想像的記憶體空間- virtual memory

比如說假設我的記憶體容量只有2G,
可是我現在要跑十支程式,
十支程式所需要的data總共10G,那怎麼辦?
但是電腦總不會連10G的data都存不下吧?
隨便C槽、D槽的容量加起來都幾百G了。
好,沒關係,想像力就是超能力
反而這十支程式也不會真的「同時」一起執行(作業系統只是快速交替執行這些程式讓你感覺程式們同時被執行了),
那麼就乾脆想像我真的有10G的空間好了,
分給十支程式一人1G大家都不用搶。

這也就是為什麼我們在【小黑馬作業系統教室】(9)(Ch8) 記憶體管理這篇說使用者看到的記體體位置可以不必等於真實位置。
所謂virtual memory就是logical memory,
virtual address 就是 logical address。
因為這個空間就是憑空想像出來的嘛,
根本就沒有加起來總共10G的記憶體空間,
可是OS讓每支程式都覺得自己有1G的空間可以用,
等到程式真的要取用data時,再透過page table,
到真實記憶體(physical memory)空間去拿。

塞進狹小的空間裡?

可是這時你應該會覺得不可能啊?
十支程式所需要的data總共10G,可是真實記憶體只有2G,
怎麼可能每支程式需要的資料都拿的到?

這時,就讓我們的作業系統表演「偷天換日術」了,
反正這十支程式是快速的交替執行嘛,
作業系統平常就把data存在加起來都幾百G的硬碟(disk)裡面,
在10G的容量面前,硬碟幾百G的容量近乎無限大了,愛怎麼存都可以,
等到程式真的要拿資料再去disk裡面拿。
這邊用擬人化比喻程式,
我們故且稱想去硬碟拿資料的程式為「程式A君」好了。

程式A君發現:「欸,我要的資料不在記憶體裡面耶?(暫時放在硬碟裡了)」
這時作業系統看看,嗯,真實記憶體裡面還有位置,
此時就把程式A君的資料搬進記憶體裡面。

程式A君工作完之後,程式B君來了,
程式B君發現:「欸,我要的資料也不在記憶體裡面耶?」
作業系統看看,嗯,真實記憶體裡面已經滿了,
那怎麼辦勒?
作業系統表示:「啊,程式A君應該暫時好一段時間不工作了吧,我先把程式A君的資料存到硬碟裡,把程式B君的資料搬進記憶體裡吧。」

虛擬記憶體運作流程總結

以上大概就是虛擬記憶體的機制了,
首先,OS為了滿足程式資料儲存空間大於真實記憶體的需求,
創造了「虛擬空間」,使每支程式都覺得自己有足夠的空間,
然而,對程式君來說,它們世界的記體體位置並不等於真實記憶體位置,
因此真的拿資料時,會先透過Page Table做查詢對應的真實記體體位置,
如果資料不在,OS再把存在硬碟裡的資料搬進真實記體體裡面。

vaild bit- 判斷資料是否在真實記體體中

問題來了,你有想過程式A君要怎麼知道「自己的資料不在記憶體中呢?」
這就要在page Table裡存下額外的資訊了,這額外的資訊為「vaild bit」。
回顧在【小黑馬作業系統教室】(9)(Ch8) 記憶體管理中,給大家看的page Table大概長這樣:

https://ithelp.ithome.com.tw/upload/images/20191109/20117114MgLylf8RH4.png

實際上page Table應該還有一個「valid bit」,
記錄資料是否在真實記體體中(v: valid, i: invalid):

https://ithelp.ithome.com.tw/upload/images/20191109/20117114X8XFGthd7w.png

譬如說page0對應到frame4,valid bit是「v」,
資料就好好的放在真實記憶體裡呢,
否則資料應該是沉睡在硬碟上。

Page fault- 程式君要的資料不在記憶體裡

剛剛程式A君的狀況,他想要去真實記體體位置拿資料,
而資料卻不在那邊(即page Table上看到的valid bit=i),
這種情況稱為「Page fault」。
以下這張圖說明當「Page fault」發生時該如何處理:

https://ithelp.ithome.com.tw/upload/images/20191109/20117114nItqv8benB.png

Step1: 程式君看了一下page Table,發現valid bit是i,自己要的資料不在真的記憶體上。
Step2: 發出一個「trap」(打擾源),說:「呼叫OS,呼叫OS,快快送上我的資料。」
Step3: OS去巨大的硬碟中尋找資料
Step4: OS把資料帶到physical memory的空位上(如果沒有空位就先把別人的資料丟回硬碟)
Step5: 重設page Table,這時valid bit=v
Step6: 程式君拿到資料了,重新開始工作。

注意注意- Page fault要付的代價是很高的

以上演示了OS的「偷天換日大法」,
但這樣把資料搬來搬去可不是在變魔術,
我們知道資料存放的地方容量由小至大為:
register->cache(快取記憶體)->memory(記憶體)->disk(磁碟),
但是由小至大的存取速度也愈慢。
(這段在計算機結構這門科目中會學到)

因為處理Page fault需要將disk裡的資料搬進memory裡,
存取disk相當耗時,
假如說memory access 的時間要200 ns的話,
處理Page fault的時間則來到驚人的8ms= 8,000,000ns。
由此可見Page fault的代價驚人,應該儘量避免。


尚未有邦友留言

立即登入留言