日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第九章 虚拟内存

發布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第九章 虚拟内存 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

物理地址和虛擬地址:

計算機的主存被組織成一個由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

總結

以上是生活随笔為你收集整理的第九章 虚拟内存的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。