第九章 虚拟内存
物理地址和虛擬地址:
計算機的主存被組織成一個由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程序員來說,管理和使用虛擬內存是一件困難和容易出錯的任務。常見的錯誤示例包括:間接引用壞指針,讀取未初始化的內存,允許棧緩沖區溢出。假設指針和它們指向的對象大小相同,引用指針而不是它所指向的對象,誤解指針運算,引用不存在的變量以及引起內存泄漏。
?
轉載于:https://www.cnblogs.com/sunnyDream/p/10262138.html
總結
- 上一篇: leetcood学习笔记-2-两数相加
- 下一篇: 项目管理-项目整体计划Excel表格绘制