計算機的主存被組織成乙個由m個連續的位元組大小的單元組成的陣列。每個位元組都有乙個唯一的實體地址(pa)。第乙個位元組位址為0,接下來為1,再接下來為2,依次類推。cpu訪問記憶體的最自然方式就是使用實體地址。我們把這種方式稱為物理定址。如圖所示。
現代處理器使用一種稱為虛擬位址的定址方式。使用虛擬定址,cpu通過生成乙個虛擬位址(va)來訪問主存,這個虛擬位址在被送到記憶體之前先准換成適當的實體地址。將乙個虛擬位址轉換成實體地址的任務叫做位址翻譯。cpu上通過記憶體管理單元這個專用硬體,利用存放在主存中的查詢表來動態翻譯虛擬位址,該錶的內容由作業系統管理。
位址空間
位址空間是乙個非負整數字址的有序集合。如果位址空間中的整數是連續的,那麼我們說它是乙個線性的位址空間。在乙個帶虛擬記憶體的系統中,cpu從乙個有n=2^n 個位址的位址空間中生成虛擬位址,這個位址空間稱為虛擬位址空間。乙個位址空間的大小由表示最大位址所需要的位數來描述。例如乙個n=2^n 個位址的虛擬位址空間就叫做乙個n位位址空間,現代作業系統通常支援32位和64位虛擬位址空間。
虛擬記憶體作為快取的工具
概念上而言,虛擬記憶體被組織為乙個由存放在磁碟上的n個連續的位元組大小的單元組成的陣列。每個位元組都有唯一的虛擬位址,作為陣列的索引。磁碟上陣列的內容被快取在主存中。和儲存器層次結構中其他快取一樣,磁碟上(較低層)的資料被分割成塊,這些塊作為磁碟和主存(較高層)之間的傳輸單元。vm系統通過將虛擬記憶體分割成為虛擬頁(virtual page,vp),每個虛擬頁的大小為p = 2^p位元組。類似的物理記憶體也被分割成為物理頁(physical page,pp),大小也是p位元組(物理頁也被成為頁幀)
在任意時刻,虛擬頁面的集合都分為三個不相交的子集:
1、未分配的:vm系統還未分配(或者建立)的頁。未分配的塊沒有任何資料和它們相互關聯,因此也不占用任何磁碟空間。
2、快取的:當前已快取在物理記憶體中已分配的頁
3、未快取:未快取在物理記憶體中的已分配頁
垃圾收集
在諸如c malloc包這樣的顯示分配器中,應用通過呼叫malloc和free來分配和釋放堆塊。應用要負責釋放所有不再需要的已分配塊。
未能釋放已分配的塊是一種常見的程式設計錯誤。
垃圾收集器是一種動態記憶體分配器,它自動釋放程式不再需要的已分配塊。這些塊被稱為垃圾。自動**堆儲存的過程叫做垃圾收集。
垃圾收集器可以將記憶體視為一張有向可達圖,該圖的節點被分為一組根節點和一組堆節點,每個堆節點對應於堆中的乙個已分配塊。根節點對應於這樣一種不在堆中的位置,它們中包含指向堆中的指標。這些位置可以是暫存器、棧裡的變數、或者是虛擬記憶體中讀寫資料區域內的全域性變數。
當存在一條從任意根節點出發並到達p的有向路徑時,我們可以說節點p是可達的。在任何時刻,不可達節點對應於垃圾,是不能被應用再次使用的。垃圾收集器的角色是維護可達圖的某種表示,並通過釋放不可達節點且將它們返回給空閒鍊錶,來定期**它們。
mark&sweep垃圾收集器
marksweep垃圾收集器由標記階段和清除階段組成,標記階段標記出根節點的所有可達的和已分配的後繼,而後面的清除階段釋放每個未被標記的已分配塊。塊頭部中空閒的低位中的一位通常用來表示這個塊是否被標記。
假設初始情況下,乙個堆由六個已分配塊組成,其中每個塊都是未分配的。第三個塊包含乙個指向第乙個塊的指標。第四個塊包含指向第三個塊和第六個塊的指標。根指向第四個塊,在標記階段之後,第乙個快、第三個塊、第四個塊和第六個塊都做了標記,因為它們是從根節點可達的。第二塊和第五塊是未標記的,因為它們是不可達的。在清除節點之後,這兩個不可達塊被**到空閒鍊錶。
c程式中常見的與記憶體相關的錯誤
對於c程式設計師來說,管理和使用虛擬記憶體是一件困難和容易出錯的任務。常見的錯誤示例包括:間接引用壞指標,讀取未初始化的記憶體,允許棧緩衝區溢位。假設指標和它們指向的物件大小相同,引用指標而不是它所指向的物件,誤解指標運算,引用不存在的變數以及引起記憶體洩漏。
CSAPP讀書日記 第九章 虛擬記憶體
虛擬記憶體是硬體異常 硬體位址翻譯 主存 磁碟檔案和核心軟體的完美互動,它為每個程序提供了乙個大的 一致的和私有的位址空間。它將主存看成是乙個儲存在磁碟上的位址空間的快取記憶體,在主存中只儲存活動區域,並根據需要在磁碟和主存之間來回傳送資料。它為每個程序提供了結構一致的位址空間,從而簡化了記憶體管理...
作業系統 第九章 虛擬記憶體管理
區域性性原理 乙個程式只要部分裝入記憶體就可以執行 程式部分裝入技術優點 區域性性原理 虛擬記憶體 虛存是對記憶體的抽象,構建在儲存體系之上,由作業系統來協調各儲存器的使用 虛擬記憶體大於物理記憶體 虛擬儲存器的大小由2個因素決定 使用虛擬記憶體的共享庫 寫時複製 當確定採用寫時複製頁面時,重要的是...
第九章 虛擬儲存器
計算機系統的主存被組織成乙個由m個連續的位元組大小的單元組成的陣列。每位元組都有乙個惟一的實體地址 physical address,pa 第乙個位元組位址是0,接下來的位元組位址為1 早期的pc使用物理定址,而且諸如數字訊號處理器,嵌入式微控制器以及cray超級計算機這樣的系統仍然繼續使用這種定址...