iT邦幫忙

1

【小白馬的OS筆記】(7) 虛擬記憶體(virtual memory),作業系統的「偷天換日大法」

小白馬帶大家繼續努力理解OS觀念囉,
之前提到說寫程式是「下指令處理資料的過程」,
程式所需要的資料我們會把它存在記憶體裡面。
然而電腦裡面總不會只有一支程式在跑,
有可能同時要跑好幾支程式。

想像的記憶體空間- virtual memory

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

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

塞進狹小的空間裡?

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

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

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

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

虛擬記憶體運作流程總結

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

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

問題來了,你有想過程式A君要怎麼知道「自己的資料不在記憶體中呢?」
這就要在page Table裡存下額外的資訊了,這額外的資訊為「vaild bit」。
回顧在【小白馬的OS筆記】(3) logical/physical memory中,給大家看的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的代價驚人,應該儘量避免。

來做個Page的考古題吧

【清大102年期中考-OS】
(a) What is page fault?
(b) Describe the steps to handle a page fault.

【解析】這邊想說「太好了,這題自己是會做的。」果然觀念先清楚了再面對考題才容易答。
【小馬答案】
(a) 當一支process要存取自己的page,對應的frame卻不在真實記憶體中,稱為page fault。
(b) 1. OS會先去disk中查找資料
2. 把資料放進記憶體中
3. 重設page table的valid bit=v
4. process重新進入工作


尚未有邦友留言

立即登入留言