在早期作業系統中,連續記憶體配置是最直觀且基礎的記憶體管理方式。其核心概念是:當一個程序(Process)需要執行時,作業系統必須在主記憶體中找到一塊連續且足夠大的空間,將該程序的完整內容(包含程式碼、資料、堆疊等)一次性載入。一旦分配,該程序在執行期間會固定在該位置,直到執行結束後才會釋放。
這種配置方式將整體記憶體空間劃分成兩大部分:
如果沒有保護機制,任何程式都可以去存取不屬於它的記憶體區塊,造成:資料毀損、系統崩潰、安全性漏洞。
保護的方式則是利用兩個特殊硬體暫存器:
在多工系統中,每個 process 都有自己的 relocation 與 limit 值,Context Switch 時,作業系統會載入新的 relocation/limit 暫存器。保證每個 process 只能存取自己分配到的記憶體區域。
當系統執行多個程式時,必須將有限的主記憶體分配給不同的 process 使用。早期「連續記憶體配置」中,整個使用者空間是一個大洞(hole),OS 需動態決定如何劃分這塊記憶體給各 process。
記憶體分配運作流程:
First Fit(首次適應法):
從記憶體低位址開始找,找到第一個符合大小的洞就使用
實作簡單、搜尋速度快(不用找完整個表);但會留下許多小而零散的碎塊(external fragmentation),容易造成記憶體「前段碎裂」
Best Fit(最佳適應法)
找最接近 process 需求大小的洞(即最小且能放得下的洞)
優點是減少立即浪費的空間,缺點是需要掃描所有洞,速度慢,且容易留下許多很小的洞,長期下來不一定最佳。
Worst Fit(最差適應法)
找最大的一個洞,把 process 放進去。
優點是放完後剩餘的洞也會比較大,未來更有機會利用。缺點是容易浪費大洞空間,效率不佳,配置結果不穩定。
當作業系統採用 連續記憶體配置 時,記憶體經過反覆的分配與釋放,會出現許多無法有效利用的空洞,導致記憶體雖然總量足夠,但卻無法提供一塊連續區塊給新的 process。這種「可用但無法利用」的空間浪費,稱為 碎裂(Fragmentation)。
外部碎裂指得是記憶體被切割成許多小洞(holes),雖然「總剩餘記憶體」足以放下新 process,但沒有一塊連續區塊能容納它。最壞情況是每兩個 process 之間都夾著一小段無法使用的洞。
50% 規則:
經驗法則:當系統有 N 個已分配區塊時,外部碎裂會額外產生約 0.5N 個小洞。
換算後,約有 1/3 的記憶體空間被浪費。
內部碎裂指得是當分配給 process 的記憶體區塊大於實際需求,多出的部分無法被利用,就造成內部浪費。
將已分配的區塊往一側搬移,把所有小洞集中在一起,合併成一個大洞,方便未來配置。
流程:
缺點:
不要求整個 process 放在連續區塊中。而是把 process 拆成多個部分,放在不同記憶體位置。但這也需要硬體(MMU)與更複雜的位址轉換支援。
因此後續會提到以下兩種技術來完成非連續分配(Noncontiguous Allocation):
優點: