在第10節已經說到,程式是分段載入記憶體的,那麼不同的段就要在記憶體中找不同的空閒位址,即將程式的各個段載入到相應的記憶體分割槽。直接的想法是有固定分割槽和可變分割槽兩種。固定分割槽就是將記憶體等分成k個分割槽,然後將段插入到空閒的等分分割槽中去,但每個段的大小不一樣,固定分割槽顯然會造成空間浪費,因此採用可變分割槽比較合適,即段大小是多少就去分多大的空間。固定分割槽與可變分割槽如下圖所示
一、可變分割槽的管理過程——核心資料結構
通過已分配分割槽表和空閒分割槽表兩張表來記錄分割槽使用情況。當有段請求時,空閒分割槽表將改變
如上圖所示,原本記憶體中已分配了seg1和seg2,空閒分割槽從位址250k開始,大小為250k,現有乙個100k大小的段請求,於是250k-350k被分配給了新請求段seg3,空閒分割槽還剩下150k.
同時由於程序可能被換入換出,所以記憶體中已分配的空間有可能被釋放,因此空閒分割槽可能存在多段,如下圖所示
那麼當存在多個空間分割槽時,再來乙個段提出記憶體請求,該選哪個呢
首先適配快,但其他分割槽就浪費類,最佳分配需要遍歷記憶體
因此需要引入分頁:解決記憶體分割槽導致的記憶體效率問題
可變分割槽多次分配以後就會形成記憶體碎片,當再來乙個段請求大於每個單個空間空間時,就需要將記憶體合併:記憶體緊縮,記憶體緊縮需要花費大量時間
因此考慮再將每個段分成多頁,記憶體也分成很多頁,頁是最小分配單位,這樣每次分配段空間,最多浪費不超過一頁,沒有記憶體碎片
針對每個段請求,系統一頁一頁的分配給這個段
那麼問題來了,像第10節一樣,每個段在計算實體地址時需要查詢段的基址,那麼將段分成頁後,計算實體地址需要查詢頁的基址,實體地址=頁基址+邏輯位址。pcb中存在頁表儲存每個段的頁分配資訊。為了取分段的頁,我們將記憶體的頁叫作頁框
作業系統之記憶體分割槽與分頁
如何將程式中的 段 資料段等內容存放在記憶體中?1 採用可變分割槽的方法,每次存放程式段之前找到與之大小匹配的空閒記憶體段,然後存放進去。2 採用此種方法需要維護2個核心資料表 空閒分割槽表和已分配分割槽表。3 此種方法隨著程序段的增多會造成大量的小空閒分割槽,也叫作記憶體碎片。如果不加以處理,會降...
邏輯 記憶體 分頁與物理分頁
本文參考自 物理分頁 物理分頁依賴的是某一物理實體,這個物理實體就是資料庫,即 在查詢資料庫時在庫里執行分頁,比如mysql資料庫提供了limit關鍵字,程式設計師只需要編寫帶有limit關鍵字的sql語句,資料庫返回的就是分頁結果。邏輯 記憶體 分頁 邏輯分頁依賴的是程式設計師編寫的 資料庫返回的...
分頁記憶體,非分頁記憶體
分頁記憶體是低中斷級別的例程可以訪問的。而非分頁記憶體則是各個中斷級別的例程都可以使用的。區別在於 分頁記憶體是虛擬記憶體,在物理上未必總是能得到。作業系統實現虛擬記憶體的主要方法就是通過分頁機制。在win32中,實體地址空間,二維虛擬位址空間和實際記憶體位址是三個不同的概念。作業系統通過段選擇子構...