關於計算機記憶體分配,主要有兩種:連續記憶體分配和非聯絡記憶體分配。需要注意的是,這是作業系統級別的,而堆與棧的記憶體分配,是屬於編譯器級別的,具體可以參考另一篇筆記:
連續記憶體分配是指為乙個程式分配位址連續的一段記憶體,當出現許多程式時,由於程式大小不一必然會出現許多的記憶體碎片,無法充分發揮出所有記憶體的價值,一般來說,連續記憶體分配主要有三種形式:
①首次適配: 遍歷記憶體,在第乙個能夠將程式放進去的地方進行記憶體分配
②最佳適配:需要統計所有可用記憶體,按大小排序,選擇滿足程式所需的最小的記憶體,容易產生很多細小的碎片
③最差適配: 同樣需要統計可用記憶體並排序,每次都給程式分配最大的記憶體,不斷將大的記憶體拆分,這樣小的碎片少了,但是較大的記憶體很快就分配完了,無法支援較大的程式。
顯然,這三種並不好評判優劣,反正都不咋地…
按一定規則對程式進行拆分,如將程式拆分成資料段、txt段、堆、執行棧等,並分別對映到記憶體的不同位置,實現程式的分段。顯然這些段的大小不是固定的,由程式設計師編寫程式控制。
段定址方式
cpu根據段號+段內偏移通過記憶體管理單元mmu中的段表進行位址對映,直接找到程式的實體地址,而段表的建立則是由作業系統來完成的。
頁定址方式
cpu定址時同樣需要頁號和頁偏移,和分段定址的不同主要有兩點
①頁表的大小是固定的
②利用了乙個新的抽象——幀的概念
關於頁和幀做一點補充:
物理記憶體劃分成固定大小的幀(2的冪次)
邏輯記憶體劃分成固定大小的頁,其中頁的大小與幀的大小保持一致
利用頁幀的幀號和偏移可以唯一確定乙個實體地址,這是寫在硬體的
頁定址還存在兩個問題:
①時間上:cpu每次定址需要訪問記憶體兩次,第一次訪問頁表,第二次訪問物理記憶體,比較耗時
②空間上:每個程式都有對應的頁表,在記憶體中存放大量頁表占用空間。
為了解決以上問題,提出了兩個新的概念:tlb和多級頁表
tlb快表(translation look-aside buffer)
快表存放在cpu內部的mmu中,訪問起來速度很快,把常用的頁表小加入tlb快取可以有效提高cpu定址效率。
tlb使用key-value關聯記憶體實現,具備快速訪問的效能
如果tlb命中將快速訪問到物理記憶體;如果沒有命中,就去查詢頁表,並且將對應的表項載入到tlb快取中來。
多級頁表
記憶體離散分配 分頁 分段
基本分頁儲存管理方式 本部分討論不具備對換功能的純分頁模式,作業執行需要全部裝入記憶體。離散分配記憶體 作業規定大小劃分成小份 記憶體也按同樣大小劃分成小份 作業的任一小份可分散放入記憶體任意未使用的小份 分頁方式下,記憶體的使用率高,浪費少。但不是絕對沒有碎片 程序的最後一頁不總是能佔滿乙個物理塊...
記憶體離散分配,分段
分頁的目的是更細粒度的處理空間,減少粗放管理的浪費或開銷問題。離散分配記憶體 作業規定大小劃分成小份 記憶體也按同樣大小劃分成小份 作業的任一小份可分散放入記憶體任意未使用的小份 分頁方式下,記憶體的使用率高,浪費少。但不是絕對沒有碎片 程序的最後一頁不總是能佔滿乙個物理塊 1 頁面的概念 記憶體劃...
4 3記憶體離散分配 分頁
基本分頁儲存管理方式 分頁的目的是更細粒度的處理空間,減少粗放管理的浪費或開銷問題。離散分配記憶體 作業規定大小劃分成小份,記憶體也按同樣大小劃分成小份 作業的任一小份可分散放入記憶體任意未使用的小份 分頁方式下,記憶體的使用率高,浪費少,但不是絕對沒有碎片 程序的最後一頁不總是能佔滿乙個物理塊 1...