主記憶體:配置、連結與分段

緊縮(compaction)

想像一個停了一半、到處是零散單格縫隙的停車場。為了騰出空間給一輛巴士,你請所有人往前開、車尾接車頭緊貼著停,把所有空位掃到後方匯成一大塊。麻煩,而且每個人都得停下來移動——但現在巴士塞得下了。緊縮就是對記憶體做這件事:把所有使用中的區塊挪到一端,讓空閒空洞合併成單一一個大空洞。

具體來說,緊縮藉由在實體記憶體中重定位行程,直到已配置區塊連續、所有空閒空間被聚在一起,以對付外部碎裂。它只有在重定位是動態的情況下才能運作——也就是每個行程的位址在執行時透過基底暫存器或記憶體管理單元轉譯——因為作業系統把每個被移動行程的基底暫存器改成它的新位置,而程式就能毫無更動地繼續運作。若位址在編譯時或載入時就已繫結,你便無法事後移動行程,緊縮也就不可能。

為什麼重要:緊縮是連續配置下對付外部碎裂的教科書解法,但它代價高昂:複製大塊記憶體要花真實時間,期間受影響的行程無法執行。可能的緊縮佈局有很多種,而挑一個便宜的本身就是個問題。由於代價的緣故,真實系統大多改用分頁來避免緊縮的需求,因為分頁從一開始就迴避了外部碎裂。

之前的佈局:[P1][30 KB 空洞][P2][60 KB 空洞]。緊縮之後:[P1][P2][90 KB 空洞]。現在一個 80 KB 的行程塞得下了,而之前不行——但作業系統為此必須複製 P2 並更新它的基底暫存器。

把散落的空洞併成一個大空洞——代價是複製記憶體。

緊縮只有在動態(執行時)重定位下才可能;你無法緊縮那些位址在編譯時或載入時就被定死的行程。而且它會使被移動的行程停擺,這就是為什麼分頁通常比緊縮更受青睞。

又稱
memory compactiondefragmentation記憶體緊縮