作業系統設計/記憶體管理
記憶體管理是指作業系統如何處理可用記憶體的術語。它在多個級別進行管理。
在最基本的層面上,有物理記憶體。物理記憶體的大小是系統中安裝的所有記憶體模組(如 DDR SDRAM)的容量總和。例如,當您在系統中安裝了兩個 512 MiB 的 DDR SDRAM 模組時,作業系統將可以使用 1 GiB 的物理記憶體。
在物理記憶體之上是分段記憶體。它使用記憶體管理單元 (MMU) 將邏輯地址(指定段和偏移量)轉換為物理地址(或線性地址)。這使得早期的計算機能夠定址超過 64 KiB 的記憶體。今天大多數作業系統不使用分段記憶體模型,而更傾向於使用分頁。
分頁記憶體模型使用 MMU 將虛擬地址轉換為物理地址。使用分頁,可以將多個 4 KiB 大小的塊(稱為頁面)對映到任何虛擬地址。例如,物理記憶體中偏移量為 0x1000 的資料可能對映到虛擬記憶體中地址為 0xC0000000(偏移量為 3 GiB)的地址,即使系統可能只有 32 MiB 的物理 RAM 可用。訪問地址 0xC0000000 處的資料在內部訪問物理地址 0x1000 處的資料。這為程序提供了自己的虛擬地址空間,其中只包含該單個程序所需的程式碼和資料,而其他所有內容都隱藏起來。這樣,一個程序就無法破壞另一個程序的程式碼或資料,從而提高了安全性 and 可靠性。
使用分頁,記憶體以 4 KiB 大小的塊進行管理。大多數應用程式需要能夠獲取一小部分記憶體來儲存資料。記憶體分配器獲取一大塊記憶體(例如,4 個頁面,或 4 * 4 KiB),並將其劃分為更小的塊(例如,16 位元組的塊和 6 位元組的塊),並在請求時將其提供給應用程式。
許多語言和一些作業系統使用一種稱為堆的分配記憶體形式,它本質上是一個大的空間,可以在其中使用和重複使用記憶體。與堆相關的還有進行垃圾回收的需要,其中未分配的空間被合併形成更大的空間,堆從最終發生的碎片中恢復過來,這種碎片發生在使用同一空間的記錄的大小在不同時間不一致時,並且被保持活動的其他分配空間保護。碎片效應會導致許多小的不可用空間散佈在堆中。垃圾回收可能包括將分配的記憶體從一個位置移動到另一個位置,以便釋放更多空間。為了使記憶體對記憶體透明,分配單元地址不能與公共地址相同,但公共地址必須是對包含分配單元地址的查詢表的引用。然後,垃圾回收器可以將資料的副本寫入新地址,然後在刪除原始資料並允許合併過程恢復空間之前更改查詢表地址。另一種技術是引用每個分配記憶體單元的起始點和結束點,當釋放記憶體單元時,測試其前後單元是否為自由單元,如果是,則重新分配包含所有連續自由部分的較大塊。在分配過程中,分配工具將從自由部分列表的頂部開始,查詢是否有一些部分與請求的大小完全相同,如果是,則選擇第一個符合條件的部分,如果沒有找到完全相同大小的部分,則選擇下一個最大的部分。垃圾回收可以連續進行,也可以在使用率低的時間進行,最終需要注意的是,如果找不到使用率低的時間,垃圾回收會導致整個計算機在碎片變得難以處理時暫時變慢。