記憶體分配 分頁 分段

2021-10-07 16:17:43 字數 1316 閱讀 2332

關於計算機記憶體分配,主要有兩種:連續記憶體分配和非聯絡記憶體分配。需要注意的是,這是作業系統級別的,而堆與棧的記憶體分配,是屬於編譯器級別的,具體可以參考另一篇筆記:

連續記憶體分配是指為乙個程式分配位址連續的一段記憶體,當出現許多程式時,由於程式大小不一必然會出現許多的記憶體碎片,無法充分發揮出所有記憶體的價值,一般來說,連續記憶體分配主要有三種形式:

①首次適配: 遍歷記憶體,在第乙個能夠將程式放進去的地方進行記憶體分配

②最佳適配:需要統計所有可用記憶體,按大小排序,選擇滿足程式所需的最小的記憶體,容易產生很多細小的碎片

③最差適配: 同樣需要統計可用記憶體並排序,每次都給程式分配最大的記憶體,不斷將大的記憶體拆分,這樣小的碎片少了,但是較大的記憶體很快就分配完了,無法支援較大的程式。

顯然,這三種並不好評判優劣,反正都不咋地…

按一定規則對程式進行拆分,如將程式拆分成資料段、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...