第 8 章 記憶體管理策略

2022-06-19 13:57:10 字數 2264 閱讀 6752

為了實現效能改進,應將多個程序儲存在記憶體中,也就是說必須共享記憶體。

記憶體是現代計算機執行的核心。記憶體由乙個很大的位元組陣列來組成,每個位元組都有各自的位址。

8.1.1 基礎硬體

cpu可以直接訪問的通用儲存只有記憶體和處理器內建的暫存器。

每個程序都有乙個獨立的記憶體空間,可以保護程序不會互相影響。

合法範圍為(base, base + limit)register

記憶體空間保護的實現是通過cpu硬體對在使用者模式下產生的位址與暫存器的位址進行比較來完成的。

只有作業系統可以通過特殊的特權指令,才能載入基位址暫存器和界限位址暫存器。不允許使用者程式修改它們。

8.1.2 位址繫結

8.1.3 邏輯位址空間和實體地址空間

cpu生成的位址通常稱為邏輯位址,而記憶體單元看到的位址(即載入到記憶體位址暫存器)通常稱為實體地址。

編譯時和載入時的位址繫結方法生成相同的邏輯位址和實體地址。

由程式生成的所有邏輯位址的集合稱為邏輯位址空間,這些邏輯位址對應的所有實體地址的集合稱為實體地址空間。

執行時位址繫結,邏輯位址空間和實體地址空間是不同的。

從虛擬位址到實體地址的執行時的對映是有記憶體管理單元(memory-management unit,mmu)的硬體裝置完成的。基位址暫存器在這裡被稱為重定位暫存器。使用者程序所生產的位址在送交記憶體之前,都將加上重定位暫存器的值。

使用者程式不會看到真實的實體地址。

8.1.4 動態載入

乙個程式只有在被呼叫時才會載入。所有程式都以重定位載入格式儲存到磁碟上。

程序必須在記憶體中以便執行。不過,程序可以暫時從記憶體中交換到備份儲存,當再次執行時再調回到記憶體。

交換有可能讓所有程序的總的實體地址空間超過真實系統的實體地址就,從而增加了系統的多道程式程度。

早期方法,每個程序位於乙個連續的記憶體區域,與包含下乙個程序的記憶體相連。

8.3.1 記憶體保護

重定位暫存器+限界暫存器

8.3.2 記憶體分配

最簡單的方法就是將記憶體分成多個固定大小的分割槽,每個分割槽只包含乙個程序。因此,多道程式的程度受限於分割槽數。

可變分割槽方案:作業系統有乙個表,用於記錄哪些記憶體可用和哪些記憶體已用。開始,所有記憶體都可用於使用者程序,因此可用作為乙個大塊的可用記憶體,稱為孔。

動態儲存分配問題,從一組可用孔中選擇乙個空閒孔的最常用的方法包括:

8.3.3 碎片

外部碎片,分割槽之間。解決方法之一是緊縮,移動記憶體內容,將所有空閒空間合併成一塊。另一種方法是執行程序的邏輯位址空間是不連續的。

內部碎片,分割槽內部,分割槽大於程序的大小。

允許程序的實體地址空間是非連續的。

基本方法

邏輯位址空間由一組段構成,每個段都有 《段號, 段偏移》。

分段硬體

實際實體地址是一維的,所以要將邏輯位址二維對映到一維上。用段表實現。

段表的每個條目都由段基位址和段界限組成。段基位址包含該段在記憶體中開始的實體地址,段界限指定了該段的長度。

邏輯位址 《段號 s, 段偏移 d>, 段號用作段表的索引,段偏移d位於[ 0 , 段界限] 之間。

實際實體地址 = 段號 s ---> 基位址 + 段偏移 d

分頁也是實體地址不聯絡,分頁避免了外部碎片和緊縮,分段不可以。也避免了將不同大小的記憶體塊匹配到交換空間的麻煩。

基本方法

將物理記憶體分為固定大小的塊,稱為幀或頁幀(frame)。

將邏輯記憶體也分為同樣大小的塊,稱為頁或頁面(page)。

cpu生成的位址分為 《頁碼p, 頁偏移d>,頁碼作為頁表的索引,頁表包含每頁所在物理記憶體的基位址。

頁大小(與幀大小一樣)是由硬體來決定的,頁的大小為 2 的冪。

頁碼  頁偏移  

<    p      ,     d    >

m-n          n

實體地址 = 頁碼---> 基位址 x 幀長度(位元組) + 頁偏移 

分頁本身是一種動態的重定位。採用分頁方案有內部碎片。分頁增加了上下文切換的時間。

硬體支援

頁表的硬體實現,標準的解決方法是採用專用的、小的、查詢快速的高速硬體緩衝,稱為轉換表緩衝區(translation look-aside buffer,tlb)。

tlb是關聯的高速記憶體。tlb條目由兩部分組成:鍵(標籤)和值。

保護分頁環境下的記憶體保護是通過與每個幀關聯的保護位來實現的,這些位儲存在頁表中。

共享頁分頁的優點之一是可以共享公共**。

可重入**是不能自我修改的**,它在執行期間不會改變。

最常用的組織頁表的技術:分層分頁、雜湊頁表和倒置頁表

將頁表再分頁。

第8章 理解記憶體

高效利用redis記憶體需要理解記憶體消耗在 然後在管理記憶體,優化記憶體。記憶體消耗分析 管理記憶體的原理和方法 記憶體優化技巧 8.1 記憶體消耗 想理解redis記憶體,首先要知道redis記憶體消耗在哪些方面。可以通過引數調整和合理使用來規避記憶體浪費。記憶體消耗可以分為程序自身消耗和子程序...

第12章 段式記憶體管理

分頁式記憶體管理基本解決了交換記憶體管理的缺點,但自己本事也有缺點 基本無法進行共享記憶體,因為對乙個記憶體頁來說只要裡面有乙個位址不能共享,那整個頁就不能共享,日常中乙個記憶體頁中不能共享資料得位址是很常見的,所以分頁記憶體基本不能共享 那怎麼解決記憶體共享的問題呢 段氏記憶體管理 段氏記憶體管理...

記憶體管理策略

在引用計數的環境下管理記憶體使用的基本模型是,通過在nsobject協議定義的方法和提供標準命名的方法。nsobject類也定義了乙個方法 dealloc 當乙個物件被釋放時此函式被呼叫。本文介紹了您需要知道的,如何正確的管理內存在乙個cocoa程式,並提供了一些正確的使用例項。記憶體管理模型是基於...