原理
為了進行段式管理,每道程式在系統中都有一個段(映象)表來存放該道程式各段裝入主存的狀況信息。段表中的每一項(對應表中的每一行)描述該道程式一個段的基本狀況,由若干個欄位提供。段名欄位用於存放段的名稱,段名一般是有其邏輯意義的,也可以轉換成用段號指明。由於段號從0開始順序編號,正好與段表中的行號對應,如2段必是段表中的第3行,這樣,段表中就可不設段號(名)欄位。裝入位欄位用來指示該段是否已經調入主存,“1”表示已裝入,“0”表示未裝入。在程式的執行過程中,各段的裝入位隨該段是否活躍而動態變化。當裝入位為“1”時,地址欄位用於表示該段裝入主存中起始(絕對)地址,當裝入位為“0”時,則無效(有時機器用它表示該段在輔存中的起始地址)。段長欄位指明該段的大小,一般以字數或位元組數為單位,取決於所用的編址方式。段長欄位是用來判斷所訪問的地址是否越出段界的界限保護檢查用的。訪問方式欄位用來標記該段允許的訪問方式,如唯讀、可寫、只能執行等,以提供段的訪問方式保護。除此之外,段表中還可以根據需要設定其它的欄位。段表本身也是一個段,一般常駐在主存中,也可以存在輔存中,需要時再調入主存。假設系統在主存中最多可同時有N道程式,可設N個段表基址暫存器。對應於每道程式,由基號(程式號)指明使用哪個段表基址暫存器。段表基址暫存器中的段表基址欄位指向該道程式的段表在主存中的起始地址。段表長度欄位指明該道程式所用段表的行數,即程式的段數。
執行命令
由系統賦給某道程式(用戶、進程)一個基號,並在調入調出過程中對有關段表基址暫存器和段表的內容進行記錄和修改,所以這些都不用用戶程式設計師來管。某道活躍的程式在執行過程中產生的指令或運算元地址只要與基號組合成系統的程式地址,即可通過查表自動轉換成主存的物理地址。下圖示意性地表示了這一地址變換的過程。分段方法能使大程式分模組編制,從而可以多個程式設計師並行編程,縮短編程時間,在執行或編譯過程中對不斷變化的可變長段也便於處理。各個段的修改、增添並不影響其它各段的編制,各用戶以段的連線形成的程式空間可以與主存的實際容量無關。分段還便於幾道程式共用已在主存內的程式和數據,如編譯程式、各種子程式、各種數據和裝入程式等。不必在主存中重複存儲,只需把它們按段存儲,並在幾道程式的段表中有公用段的名稱及同樣的基址值即可。由於各段是按其邏輯特點組合的,容易以段為單位實現存儲保護。例如,可以安排成常數段只能讀不能寫;運算元段只能讀或寫,不能作為指令執行;子程式段只能執行,不能修改;有的過程段只能執行,不能讀也不能寫,如此等等。一旦違反規定就中斷,這對發現程式設計錯誤和非法使用是很有用的。段式管理的虛擬存儲器由於各個段的長度完全取決於段自身,當然不會恰好如下圖那樣是1K的整數倍,段在主存中的起點也會是隨意的,這就給高效地調入段分配主存區域帶來困難。
進行管理
為了進行段式管理,除了系統需要為每道程式分別設定段映象表外,還得由作業系統為整個主存系統建立一個實主存管理表,它包括占用區域表和可用區域表兩部分。占用區域表的每一項(行)用來指明主存中哪些區域已被占用,被哪道程式的哪個段占用以及該段在主存的起點和長度。此外,還可以設定諸如該段是否進入主存後被改寫過的欄位,以便該段由主存中釋放時,決定是否還要將其寫回到輔存中原先的位置來減少輔助操作。可用區域表的每一項(行)則指明每一個未被占用的基地址和區域大小。當一個段從輔存裝入主存時,作業系統就在占用區域表中增加一項,並修改可用區域表。而當一個段從主存中退出時,就將其在占用區域表的項(行)移入可用區域表中,並進行有關它是否可與其它可用區歸併的處理,修改可用區域表。當某道程式全部執行結束或者是被優先權更高的程式所取代時,也應將該道程式的全部段的項從占用區域表移入可用區域表並作相應的處理。
優缺點
在段式存儲管理中,每個段地址的說明為兩個量:一個段名和一個位移。在段內,是連續完整存放的。而在段與段之間是不一定連續編址的。段名和位移構成了一種二維編址。 段式管理是不連續分配記憶體技術中的一種。其最大特點在於他按照用戶觀點,即按程式段、數據段等有明確邏輯含義的“段”,分配記憶體空間。克服了頁式的、硬性的、非邏輯劃分給保護和共享與支態伸縮帶來的不自然性。 段的最大好處是可以充分實現共享和保護,便於動態申請記憶體,管理和使用統一化,便於動態連結;其缺點是有碎片問題。