便於程式設計師編寫程式(分治)
可以控制每個段的許可權(寫/讀)
符合跳轉指令邏輯 《段號,段內偏移》
執行時重定位:
當執行某條指令時才進行位址重定位,先查詢程序pcb指向的段表,然後根據偏移量算出實體地址。
編譯時重定位:
編譯時就把所有跳轉指令進行重定位。(缺點:導致必須使用重定位後的那一段記憶體,若那一段記憶體被其他程式占用,則該程式無法執行)
載入時重定位:
當程式載入記憶體時進行重定位。(缺點:載入後程序占用的不能進行記憶體交換)
gdt表可以被看做是作業系統的段表
ldt表則是程序的段表
避免記憶體浪費,產生記憶體碎片
首先將偏移量右移3位得到頁號,然後查頁表得到實際的頁框,根據頁框*4k+偏移量後三位得到實際記憶體位址。
假設32位系統,那麼位址範圍為0~2^32-1,如果乙個程序既訪問了低位址,又訪問了高位址,那麼頁表項就非常多(為了保證可以o(1)讀出,即使沒有使用的頁表項也要佔位),這就導致需要建立1m頁表項(必須要是連續的記憶體),如果有100個類似的程序則會占用100m記憶體,這顯然不可接受。(事實上,大部分位址根本沒有被使用。)
首先建立頁表索引,索引指向它管理的一部分頁表,然後只需要載入需要使用的位址範圍的頁表和索引頁表即可,並且這樣管理頁表也實現了頁表的離散儲存,不要用很大一塊連續的記憶體來儲存頁表。
程式很強的區域性性。
為了使訪問速度更快。
將近期訪問到的頁表項存入乙個暫存器(64-1024項),使這一部分頁表項可以1次索引就找到。
實際的物理記憶體有限,而每個程序實際頻繁訪問的記憶體頁只佔其定址範圍的很小一部分(程式的區域性性!!!)所以使用請求調頁的方式充分利用物理記憶體。
首先根據段頁式記憶體管理,當乙個程序得到虛擬位址準備去程序頁表查實際的實體地址時,若發現該頁沒有實體地址的對映,那麼即發生缺頁,呼叫缺頁中斷,請求從磁碟中調入該頁。
當需要調頁時,若實體地址全部被使用,那麼就需要淘汰一頁,此時可以利用fifo(效率不高),min(最優,不可實現),lru(實現成本大),scr(可用)等演算法來進行置換。
通俗解釋:系統內程序增多⇒每個程序的缺頁率增大⇒缺頁率增大到一定程度,程序總等待調頁完成⇒cpu利用率降低⇒程序進一步增多,缺頁率更大
當顛簸發生時,可以通過改變給程序分配的頁框數一定程度上緩解,但會導致請求調頁所實現的記憶體高效利用失效,而太少則會造成顛簸。所以當程序過多時,一般只能採用殺死部分程序方法解決顛簸。
作業系統之記憶體管理
記憶體管理的功能有 1 空間分配與 2 位址轉換 3 空間擴充 4 儲存保護 將資料與程式裝入記憶體分以下步驟 1 編譯成模組 2 鏈結模組 分靜態 裝入時動態 執行時動態鏈結 3 將模組裝入記憶體 分絕對裝入 可重定位裝入 執行時動態裝入 邏輯位址與實體地址 訪問資料時是使用實體地址獲取資料,多個...
作業系統之記憶體管理
位址對映和重定位是乙個概念 適應於請求段的記憶體分配方法是最佳適應和可變分割槽 可重入 reentrant code 又稱為 純 purecode 是一種允許多個程序同時訪問的 為使各個程序所執行的 完全相同,絕對不允許可重入 在執行中有任何改變。目的 擴充主存容量 最基本的特徵 多次性 最主要的技...
作業系統之記憶體管理
訊號量 計數器,鎖機制 用來同步 訊號 通知某一事件已經發生 管道 父子程序 命名管道 任意程序 共享記憶體 實現多個程序共享的乙個記憶體。訊息佇列 訊息鍊錶 套接字鎖機制 互斥鎖 條件變數 讀寫鎖 訊號量機制 訊號機制 先來先服務 短作業優先 時間片輪轉法 高響應比優先 優先權排程演算法 多級佇列...