iT邦幫忙

1

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

大家好,我是心原一馬,
今天要繼續講講記憶體管理的議題。

上一篇: 【小黑馬作業系統教室】(10) (Ch8) 查找真實地址的加速- Translation Look-aside Buffers (TLB)

碎片化(fragmentaion)- 用停車場的例子聯想

https://ithelp.ithome.com.tw/upload/images/20191225/201171146VN78sruOu.png

想像你的記憶體是個停車場
記憶體存放的程式則是車子
但因程式大小不同,猶如有不同大小的車子,
如摩拖車、家用汽車、大卡車、…之類的。
這時,你會兩種方法可以管理你的停車場:

  1. 為停車位劃分一格一格固定大小的車位
  2. 不劃分車位,只要有空間就可以停車。

當然,這兩種方式都會造成一些問題,

  1. 如果是劃分一格一格固定大小的車位,為了讓所有車種都可以停進停車格上,車位可不能劃太小,你大概要把車位劃的讓大卡車停的進來。但是,這樣當摩拖車停在車位上時,對於那個停車格來說便有很大一塊空間是浪費的,這個現象稱為「內部碎片化」(internal fragmentaion)
  2. 如果是不劃分車位,只要有空間就可以停車。假設一開始來了一輛大卡車,然後一台摩拖車緊接著停在大卡車旁,然後一輛家用汽車停在摩拖車旁邊。這時摩拖車可能事情辦完被騎走了,你會發現大卡車和家用汽車中間就留下了一些空間泿費(原本停摩拖車的空間),這種車子和車子間的空間浪費則稱為「外部碎片化」(external fragmentaion)。

以電腦語言來定義fragmentaion

看了生活化的例子,相信再看較正式的定義會比較好懂:

  • internal fragmentaion: 作業系統配置給 process 的 memory 空間大於 process 真正所需的空間,這些多出來的空間該 process 用不到,而且也沒辦法供其他 process 使用,形成浪費。
  • external fragmentaion: 系統中,所有可用空間總和大於某個 process 所需要,但因為這些空間不連續而無法配給該 process 使用,造成 memory 空間閒置的浪費。

真實系統在paging前做segmentation

系列文前兩篇我們一直在講paging,
透過page table將使用者視角的logical address映射到 physical address,
然而在真實的電腦作業系統中,
實際上還會再多一層轉換,
叫做segmentation,
這邊放個精美的投影片講解圖:

https://ithelp.ithome.com.tw/upload/images/20191117/20117114nSfPg83s0J.png

首先,使用者寫程式所看到的變數地址稱為「logical address」,
先透過segmentation將logical address映射至「linear address」,
再透過paging 將「linear address」映射至「physical address」。

你可能會覺得很奇怪,
為什麼要有兩層的地址轉換?
直接將「logical address」映射至「physical address」不行嗎?
這就是跟剛剛提到的碎片化(fragmentaion)有關了。

為什麼不能只有paging?

對於記憶體管理來說,paging只能解決「外部碎片化」的問題,
因為paging將使用者的地址切成一塊塊固定大小,
猶如停車位劃分一格一格固定大小的車位,
車位和車位間是可以沒有間隙的,所以這樣不會有「外部碎片」。
但是若只有paging,仍可能有程式要的空間太多而形成內部碎片的問題。

segmentation則是解決內部碎片的問題,
較符合使用者的視角,
比如說將使用者程式相近的地址打包成一個page啦。
以停車格的比喻來說,
就是我發現其實大卡車的停車格可以停下3台摩拖車,
先將3台摩拖車映射到同一塊地址,
再將他們停到同一個停車位,
以解決內部碎片的問題。

第八章觀念的部分大概就整理到此了,
至於地址轉換上的具體運作,
如何將「logical address」轉為「linear address」,
再將「linear address」映射至「physical address」。

小馬預計再另寫個 【小黑馬作業系統考古】系列,
專門整理作業系統的考題,
幫助修習作業系統課的芸芸眾生渡過難關。
(目前小馬處於期末爆炸,努力中…)


尚未有邦友留言

立即登入留言