iT邦幫忙

2025 iThome 鐵人賽

DAY 21
0
Software Development

用作業系統讀懂另一半的OS系列 第 21

【2025鐵人賽】用作業系統讀懂另一半的OS:Main Memory 02

  • 分享至 

  • xImage
  •  

連續記憶體配置(Contiguous Memory Allocation)

在早期作業系統中,連續記憶體配置是最直觀且基礎的記憶體管理方式。其核心概念是:當一個程序(Process)需要執行時,作業系統必須在主記憶體中找到一塊連續且足夠大的空間,將該程序的完整內容(包含程式碼、資料、堆疊等)一次性載入。一旦分配,該程序在執行期間會固定在該位置,直到執行結束後才會釋放。

這種配置方式將整體記憶體空間劃分成兩大部分:

  • 作業系統區 (OS Area):通常位於記憶體的高位址或低位址,存放作業系統核心、中斷向量、I/O 驅動程式等關鍵部分。這塊區域受到保護,使用者程式無法直接存取。
  • 使用者程式區 (User Area):剩餘的空間則提供給所有使用者程序使用。

記憶體保護(Memory Protection)

如果沒有保護機制,任何程式都可以去存取不屬於它的記憶體區塊,造成:資料毀損、系統崩潰、安全性漏洞。
保護的方式則是利用兩個特殊硬體暫存器:

  1. Relocation Register(基底暫存器):紀錄此 process 的起始實體位址,所有邏輯位址都會加上這個值,轉換成實體位址
  2. Limit Register(範圍限制暫存器):紀錄此 process 可用的記憶體長度。若存取超出範圍,系統會觸發錯誤(trap)。

https://ithelp.ithome.com.tw/upload/images/20250730/20177764qGzU84fbCC.png

在多工系統中,每個 process 都有自己的 relocation 與 limit 值,Context Switch 時,作業系統會載入新的 relocation/limit 暫存器。保證每個 process 只能存取自己分配到的記憶體區域。

記憶體分配(Memory Allocation)

當系統執行多個程式時,必須將有限的主記憶體分配給不同的 process 使用。早期「連續記憶體配置」中,整個使用者空間是一個大洞(hole),OS 需動態決定如何劃分這塊記憶體給各 process。

記憶體分配運作流程:

  1. OS 尋找一個足夠大的洞(hole),可容納即將進入的 process
  2. 分割出一塊記憶體 給該 process
  3. 剩餘部分保留成新的洞
  4. 當 process 結束,釋放記憶體 → 形成新的洞
  5. 如果釋放的洞與相鄰洞相連 → 合併(merge) 成較大的洞

洞的選擇策略(Hole Selection)

  1. First Fit(首次適應法):
    從記憶體低位址開始找,找到第一個符合大小的洞就使用
    實作簡單、搜尋速度快(不用找完整個表);但會留下許多小而零散的碎塊(external fragmentation),容易造成記憶體「前段碎裂」

  2. Best Fit(最佳適應法)
    找最接近 process 需求大小的洞(即最小且能放得下的洞)
    優點是減少立即浪費的空間,缺點是需要掃描所有洞,速度慢,且容易留下許多很小的洞,長期下來不一定最佳。

  3. Worst Fit(最差適應法)
    找最大的一個洞,把 process 放進去。
    優點是放完後剩餘的洞也會比較大,未來更有機會利用。缺點是容易浪費大洞空間,效率不佳,配置結果不穩定。

Fragmentation(記憶體碎裂問題)

當作業系統採用 連續記憶體配置 時,記憶體經過反覆的分配與釋放,會出現許多無法有效利用的空洞,導致記憶體雖然總量足夠,但卻無法提供一塊連續區塊給新的 process。這種「可用但無法利用」的空間浪費,稱為 碎裂(Fragmentation)。

External Fragmentation(外部碎裂)

外部碎裂指得是記憶體被切割成許多小洞(holes),雖然「總剩餘記憶體」足以放下新 process,但沒有一塊連續區塊能容納它。最壞情況是每兩個 process 之間都夾著一小段無法使用的洞。

50% 規則:
經驗法則:當系統有 N 個已分配區塊時,外部碎裂會額外產生約 0.5N 個小洞。
換算後,約有 1/3 的記憶體空間被浪費。

Internal Fragmentation(內部碎裂)

內部碎裂指得是當分配給 process 的記憶體區塊大於實際需求,多出的部分無法被利用,就造成內部浪費。

解法 01:Compaction(壓縮)

將已分配的區塊往一側搬移,把所有小洞集中在一起,合併成一個大洞,方便未來配置。

流程:

  1. 動態搬移記憶體中的 process。
  2. 更新 relocation register,讓 process 的邏輯位址對應新的實體位址。
  3. 最後獲得一塊較大的連續空間。

缺點:

  • 成本高(需大量資料搬移)
  • 系統執行中壓縮會拖慢效能
  • 需硬體支援 動態位址重配置(Dynamic Relocation)

解法 02:非連續分配(Noncontiguous Allocation)

不要求整個 process 放在連續區塊中。而是把 process 拆成多個部分,放在不同記憶體位置。但這也需要硬體(MMU)與更複雜的位址轉換支援。

因此後續會提到以下兩種技術來完成非連續分配(Noncontiguous Allocation):

  1. Paging(分頁):將記憶體切成固定大小的頁框(frames),process 拆成頁(pages)分散配置。
  2. Segmentation(分段):依照程式結構(程式碼段、資料段、堆疊段)分散配置。

優點:

  • 不再需要大型連續空間
  • 徹底消除外部碎裂問題

上一篇
【2025鐵人賽】用作業系統讀懂另一半的OS:Main Memory 01
下一篇
【2025鐵人賽】用作業系統讀懂另一半的OS:Main Memory 03
系列文
用作業系統讀懂另一半的OS30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言