什麼是分段?


分段是另一種記憶體分配方法,可以替代或與分頁一起使用。在其最純粹的形式中,程式被分成多個段,每個段都是一個獨立的單元,包括子程式或資料結構。

與頁不同,段的大小可以變化。這要求MMU以與管理分頁記憶體略有不同的方式來管理分段記憶體。分段MMU包含一個段表來跟蹤駐留在記憶體中的段。

段可以在多個地址中的一個處建立,並且可以是任何大小,每個段表條目都應包含起始地址和段大小。一些系統允許段從任何地址開始,而其他系統則限制起始地址。英特爾X86架構中就存在這樣一個限制,它要求段從地址的低四位為6000的地址開始。

具有此限制的系統不需要將其段表中儲存這四個位,因為它們的值是隱式的。如下圖所示,它顯示了分段記憶體的簡化地址轉換方案。

偏移量與段大小進行比較。如果偏移量高於或等於段大小,則表示該位置不是段的一部分,會產生錯誤。如果偏移量具有真實值,則將其插入到段地址的開頭以建立正確的物理記憶體地址。與分頁一樣,分段MMU也可以擁有TLB來加速段起始地址和大小的生成。

在分頁中,頁號被髮送到頁表(和TLB)以生成幀號。此值與偏移量連線以生成物理地址。在分段中,由段表或TLB生成的起始地址加到偏移量上,這個過程比連線更耗時。

由於段可以具有不同的尺寸,因此與分頁相比,此方法既有優點也有缺點。考慮一下相對簡單的CPU的分頁示例。

在分頁記憶體執行中,每頁的大小為4K。大小為4K+1的程式需要MMU分配兩頁記憶體,即使第二頁只使用了其4K位置中的一個。這被稱為內部碎片。如果使用分段,則可以分配大小正好為4K+1的段,從而避免此問題。

分段存在一個稱為外部碎片的問題。記憶體中有三個段和8K的可用空間。可用空間被細分,因此沒有高於3K的段可以載入到記憶體中,而無需更改或刪除當前載入的段之一。它透過將資料移回交換磁碟或重新定位到記憶體中來引入開銷,這兩者都會降低系統性能。

更新於:2021年7月27日

4K+ 次檢視

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告