全面解析虚拟内存概念
生活随笔
收集整理的這篇文章主要介紹了
全面解析虚拟内存概念
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一個系統(tǒng)中的進程是與其他進程共享CPU和主存資源的。隨著對CPU需求的增長,進程以某種合理的平滑的方式慢了下來。但是如果太多的進程需要太多的內(nèi)存,那么它們中的一些就根本無法運行。當一個程序中沒有空間可以用時,那就是它運氣不好了。內(nèi)存還容易被破壞。如果某個進程不小心寫了另一個進程使用的內(nèi)存,它就可能以某種完全和程序邏輯無關(guān)的令人迷惑的方式失敗。
為了更加有效的管理內(nèi)存并且少出錯,現(xiàn)代系統(tǒng)提供了一種對主存的抽象的概念,叫做虛擬內(nèi)存(VM)。虛擬內(nèi)存時硬件異常、硬件地址翻譯、主存、磁盤文件和內(nèi)核軟件的完美交互,它為每一個進程提供一個大的、一致的和私有的地址空間。通過一個很清晰的機制,虛擬內(nèi)存提供了三個很重要的能力:
它將主存看成是一個存儲在磁盤上的地址空間的高速緩存,在主存中只保存活動區(qū)域,并根據(jù)需要在磁盤和主存之間來回傳送數(shù)據(jù),通過這種方式,高效的使用了主存。 它為每個進程提供了一致的地址空間,從而簡化了內(nèi)存管理 它保護了每個進程的地址空間不被其他進程破壞。
早期的PC使用的是物理地址,而且諸如數(shù)字信號處理器、嵌入式微控制器以及Cray超級計算機這樣的系統(tǒng)仍然還是繼續(xù)使用這種尋址方式。然而現(xiàn)代的處理器使用的是一種稱為虛擬尋址(virtual address)的尋址方式。使用虛擬地址,CPU通過生成一個虛擬地址(Virtual Address,VA)來訪問主存,這個虛擬地址在被送到內(nèi)存之前先轉(zhuǎn)換成適當?shù)奈锢淼刂?。將這個虛擬地址轉(zhuǎn)換成物理地址的任務叫做地址翻譯(address translation)。就像異常處理一樣,地址翻譯需要CPU硬件和操作系統(tǒng)的緊密合作。CPU芯片上叫做內(nèi)存管理單元(MMU)的專有硬件,利用存放主存中的查詢表來動態(tài)的翻譯虛擬地址,該表的內(nèi)容由操作系統(tǒng)來管理。
? ??地址空間是一個非負整數(shù)的有序集合{0,1,2,.......}。如果地址空間中的整數(shù)是連續(xù)的,那么我們說它是一個線性的連續(xù)地址空間。在一個帶有虛擬內(nèi)存的系統(tǒng)中,CPU從一個由N個地址的地址空間中生成虛擬地址,這個地址空間稱為虛擬地址空間(virtual address space)。一個地址空間的大小是由表示最大地址所需要的位數(shù)來描敘的?,F(xiàn)代系統(tǒng)通常支持32位或者64位虛擬地址空間。? ? 一個系統(tǒng)還有一個物理地址空間(physical address space),對應于系統(tǒng)中物理內(nèi)存的M個字節(jié)。地址空間的概念是十分重要的,因為它清楚地區(qū)分了數(shù)據(jù)對象(字節(jié))和它們地屬性(地址)。一旦認識到了這種區(qū)別,那么我們就可以將其推廣了,允許每個數(shù)據(jù)對象有多個獨立地地址空間,其中每個地址都選自一個不同的地址空間。這就是虛擬內(nèi)存的基本思想。主存中的每字節(jié)都有一個選自虛擬空間的虛擬地址和一個選自物理空間的物理地址。
未分配:VM系統(tǒng)還未分配(或者創(chuàng)建)的頁。未分配的塊沒有任何數(shù)據(jù)和它們相關(guān)聯(lián),因此也就不占用任何磁盤空間。 緩存的:當前已緩存在物理內(nèi)存中的已分配頁。 未緩存的:未緩存在物理內(nèi)存中的已分配頁。
一。物理和虛擬尋址
? ??計算機系統(tǒng)的主存被組織成一個有M個連續(xù)的字節(jié)大小的單元組成的數(shù)組。每字節(jié)都有一個唯一的物理地址(PA)。第一個字節(jié)的物理地址為0,接下來的字節(jié)地址為2,依次類推。給定這種簡單的結(jié)構(gòu),CPU方位內(nèi)存的最自然的方式就是使用物理地址。我們把這種方式稱為物理尋址(physical addressing)。早期的PC使用的是物理地址,而且諸如數(shù)字信號處理器、嵌入式微控制器以及Cray超級計算機這樣的系統(tǒng)仍然還是繼續(xù)使用這種尋址方式。然而現(xiàn)代的處理器使用的是一種稱為虛擬尋址(virtual address)的尋址方式。使用虛擬地址,CPU通過生成一個虛擬地址(Virtual Address,VA)來訪問主存,這個虛擬地址在被送到內(nèi)存之前先轉(zhuǎn)換成適當?shù)奈锢淼刂?。將這個虛擬地址轉(zhuǎn)換成物理地址的任務叫做地址翻譯(address translation)。就像異常處理一樣,地址翻譯需要CPU硬件和操作系統(tǒng)的緊密合作。CPU芯片上叫做內(nèi)存管理單元(MMU)的專有硬件,利用存放主存中的查詢表來動態(tài)的翻譯虛擬地址,該表的內(nèi)容由操作系統(tǒng)來管理。
二。地址空間
? ??地址空間是一個非負整數(shù)的有序集合{0,1,2,.......}。如果地址空間中的整數(shù)是連續(xù)的,那么我們說它是一個線性的連續(xù)地址空間。在一個帶有虛擬內(nèi)存的系統(tǒng)中,CPU從一個由N個地址的地址空間中生成虛擬地址,這個地址空間稱為虛擬地址空間(virtual address space)。一個地址空間的大小是由表示最大地址所需要的位數(shù)來描敘的?,F(xiàn)代系統(tǒng)通常支持32位或者64位虛擬地址空間。? ? 一個系統(tǒng)還有一個物理地址空間(physical address space),對應于系統(tǒng)中物理內(nèi)存的M個字節(jié)。地址空間的概念是十分重要的,因為它清楚地區(qū)分了數(shù)據(jù)對象(字節(jié))和它們地屬性(地址)。一旦認識到了這種區(qū)別,那么我們就可以將其推廣了,允許每個數(shù)據(jù)對象有多個獨立地地址空間,其中每個地址都選自一個不同的地址空間。這就是虛擬內(nèi)存的基本思想。主存中的每字節(jié)都有一個選自虛擬空間的虛擬地址和一個選自物理空間的物理地址。三。虛擬內(nèi)存作為緩存的工具
? ??概念上而言,虛擬內(nèi)存被組織為一個由存放在磁盤上的N個連續(xù)的字節(jié)大小的單元組成的數(shù)組。每字節(jié)都有一個唯一的虛擬地址,作為到數(shù)組的索引。磁盤上數(shù)組的內(nèi)容被緩存到主存中。和存儲器層次結(jié)構(gòu)中其他緩存一樣,磁盤(較低層)上的數(shù)據(jù)被分割為塊,這些塊作為磁盤和主存之間的傳輸單元。VM系統(tǒng)通過將虛擬內(nèi)存分割為稱為虛擬頁(Vitrual Page)的大小固定的塊來處理這個問題。每個頁面大小為P字節(jié)。類似的,物理內(nèi)存頁被分割為物理頁(Physical page,PP),大小也為P字節(jié)(物理頁面也被稱為頁幀 Page frame)。? ? 在任何時刻,虛擬頁面的集合都分為三個不相交的子集:四。頁表
?? ?同任何緩存一樣,虛擬內(nèi)存系統(tǒng)必須由某種方法來判定一個虛擬頁是否緩存在DRAM中的某個地方。如果是,系統(tǒng)還必須確定這個虛擬頁存放在哪個物理頁面中。如果不命中,系統(tǒng)必須判斷這個虛擬頁面放在磁盤的哪個位置,在物理內(nèi)存中選擇一個犧牲頁,并將虛擬頁從磁盤復制到DRAM中,替換這個犧牲頁面。 ? ? 這些功能是軟硬件聯(lián)合提供的,包括操作系統(tǒng)、MMU(內(nèi)存管理單元)中的地址翻譯硬件和一個存放在物理內(nèi)存中叫作頁表(page table)的數(shù)據(jù)結(jié)構(gòu),頁表將虛擬頁映射到物理頁面。每次地址翻譯硬件將一個虛擬地址轉(zhuǎn)換為物理地址時,都會讀取頁表。操作系統(tǒng)負責維護頁表的內(nèi)容,以及在磁盤與DRAM之間來回傳送頁。 下圖展示了一個頁表的基本組織結(jié)構(gòu)。頁表就是一個頁表條目(Page Table Entry)的數(shù)組。虛擬地址空間中的每個頁在頁表中都有一個固定的偏移量處都有一個PTE。為了我們的目的,我們假設(shè)每個PTE是由一個有效位(valid bit)和一個n位地址字段組成的。有效位表明了該虛擬頁面當前是否被緩存在DRAM中。如果設(shè)置了有效位,那么地址字段就表示DRAM中相應的物理頁的起始位置,這個物理頁中緩存了該虛擬頁。如果沒有設(shè)置有效位,那么這個空地址表示這個虛擬頁還未被分配。否則,這個地址就會指向該虛擬頁在磁盤上的起始位置。五。地址翻譯
總結(jié)
以上是生活随笔為你收集整理的全面解析虚拟内存概念的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Centos系统磁盘扩容
- 下一篇: 内存映射IO (MMIO) 简介