【计算机基础】 Virtual memory 虚拟内存
Virtual memory 虛擬內(nèi)存
虛擬內(nèi)存的作用
- 將主存看成存儲在磁盤上的地址空間的高速緩存,在主存中只保存活動區(qū)域,并根據(jù)需要在磁盤和主存之間來回傳送數(shù)據(jù),高效實用主存
- 為每個進程提供一致的地址空間,簡化內(nèi)存管理
- 保護每個進程的地址空間不被其他進程破壞
- 保護:一組確保共享處理器、主存、I/O設(shè)備的多個進程之間沒有故意地,無意地讀寫其他進程的數(shù)據(jù)機制
物理地址和虛擬地址 Physical Address & Virtual Address
物理地址: 主存儲器的地址
物理尋址: CPU執(zhí)行指令后直接生成一個物理地址,通過內(nèi)存總線傳遞給主存。主存取出物理地址處的字節(jié)并返回給CPU
虛擬地址: 虛擬空間的地址,當(dāng)需要訪問主存時需要通過地址映射轉(zhuǎn)換為物理地址
虛擬尋址: CPU執(zhí)行指令后先生成一個虛擬地址,虛擬地址在被送到內(nèi)存之前先轉(zhuǎn)換成對應(yīng)的物理地址(地址翻譯 address translation)
虛擬存儲器和cache的工作原理是一樣的,在虛擬存儲器中,塊被稱為頁(page),訪問缺失稱為缺頁(page fault) 即訪問的頁不在主存中,需要到磁盤中去尋找。
Page fault的代價是很高的,一次缺頁處理將花費數(shù)百萬個時鐘周期,因為主存大概比磁盤快100000倍。
在設(shè)計虛擬存儲系統(tǒng)時應(yīng)考慮一些關(guān)鍵性因素:
- 頁應(yīng)該足夠大(目前典型4-16KB)
- 使用能降低缺頁率的組織結(jié)構(gòu)(頁以全相聯(lián)(fully associated)的方式放置
- 缺頁用軟件處理,使用算法來選擇替換頁
- 由于寫時間太長,因此在虛擬內(nèi)存中,寫直達(dá)機制不能很好地管理寫操作,因此虛擬存儲系統(tǒng)中都采用寫回機制
虛擬存儲器的地址被劃為虛頁號(virtual page number)和頁偏移(page offset),物理頁號構(gòu)成物理地址的高位部分,而頁偏移是不變的,構(gòu)成物理地址的低位部分,頁偏移域的位數(shù)決定了頁的大小。
Example:
64KB pages -> 2^6 * 2^10 bytes pages -> 2^16 bytes pages -> 16-bit page offset
64-bit machine -> 64-bit virtual address -> 64 - 16 (page offset) = 48-bit virtual page number
Maximum 256MB memory -> 2^8 * 2^20 Bytes memory -> 2^28 Bytes -> 28-bit Physical Address
-> 28-16 (page offset) = 12-bit Physical page number
頁的存放和查找
頁表 Page table
——保存著虛擬地址和物理地址之間轉(zhuǎn)換關(guān)系的表。頁表保存在主存中,通常使用虛頁號來索引。如果這個虛頁當(dāng)前在主存中,頁表中的對應(yīng)項將包含虛頁對應(yīng)的物理頁號。
- 每個進程都有它自己的頁表
- 頁表就是一個頁表條目(page table entry)的數(shù)組。虛擬地址空間中的每個頁在頁表中的一個固定偏移量處都有一個PTE
- 每個頁表條目包含1位有效位,如果該位為無效,則該頁不在主存中,就發(fā)生一次缺頁。如果該位為有效,表明該頁在主存中,并且該頁包含有物理頁號。
為了指出頁表在存儲器中的位置,硬件包含一個指向頁表首地址的寄存器:頁表寄存器(Page table register)
頁表大小 Page Table Size:
E.g.
How big is a page table on the following machine?
- 32-bit machine
- 4B per page table entry
- 4KB pages
32-bit machine -> 32-bit virtual address -> 2^32 = 4 * 2^30 bytes virtual memory -> 4GB virtual memory
4GB virtual memory / 4KB page size = 2*20 virtual pages = 1M virtual pages
1M virtual pages * 4 Bytes per page table entry = 4 MB page table.
How big would the page table be with 64KB pages?
4GB virtual memory / 64KB page size = 64K virtual pages
64k virtual pages * 4B per page table entry = 256 KB
How big would it be for a 64-bit machine, 64KB pages?
64-bit machine -> 64-bit virtual address -> 2^64 bytes virtual memory
2^64 bytes virtual memory / 64KB page size = 2^48 virtual pages
2^48 virtual pages *4B per page table entry = 2^50 = 1 peta-Byte page table.
----->> TOO large to fit in memory!
并且,就算頁表的大小是4MB,每個程序在執(zhí)行的任何時候都需要4MB的存儲器空間,如果同時有成百上千個進程同時運行,每個程序都有各自的頁表,所需的存儲量也是巨大的。
以下幾種方法都是針對減少所需的最大存儲量以及減少用于頁表的主存:
-
使用界限寄存器,對給定的進程限制其頁表的大小。
缺陷:要求地址空間只朝一個方向拓展
-
但允許地址空間只朝一個方向拓展往往不夠,因為多數(shù)語言需要兩種大小可擴展的區(qū)域:從最高地址往下擴展的棧空間和從最低地址網(wǎng)上擴展的堆空間。這就意味著有兩個獨立的頁表和兩個獨立的界限。兩個頁表的使用將地址空間分成兩段。地址的高位用于判斷該地址使用了哪個段和哪個頁表。由于段由地址的高位部分決定,每一段可以有地址空間的一半大。每段的界限寄存器指定了當(dāng)前段的大小,該大小以頁尾單位增長。
缺陷:當(dāng)以一種稀疏方式使用地址空空間而不是連續(xù)的虛擬地址時,執(zhí)行效果就不大好。
-
反置頁表,對虛擬地址使用哈希函數(shù),頁表需要的容量僅僅是主存中的物理頁數(shù)。
缺陷:查找過程略微復(fù)雜,因為不能僅依靠索引來訪問頁表。
-
將頁表再分頁,來減少頁表占用的實際主存空間
-
多級頁表。 這種機制允許以一種稀疏的方式來使用地址空間而不用分配整個頁表。對很大的地址空間和在需要非連續(xù)地址分配的軟件系統(tǒng)中,這種機制尤為有效。
缺陷:地址轉(zhuǎn)換過程更為復(fù)雜。
加快地址轉(zhuǎn)換:TLB
由于頁表放在主存中,程序每次訪問至少需要兩次:
提高訪問性能的關(guān)鍵在于依靠頁表的訪問局部性:當(dāng)一個轉(zhuǎn)換的虛頁號被使用時,它可能在不久的將來再次被用到(temporal locality
所以處理器中都包含一個特殊的cache來跟蹤最近使用過的地址變換,即快表(Translation-Lookaside Buffer,TLB),地址變換高速緩存。
- Small cache: 16-64 entries, often fully associated.
Work Steps
CPU產(chǎn)生一個虛擬地址
從TLB中取出相應(yīng)的PTE
-
TLB命中:
- 將虛擬地址翻譯成物理地址,并發(fā)送到高速緩存/主存
- 高速緩存/主存將所請求的數(shù)據(jù)字返回給CPU
-
TLB不命中(TLB Miss)
- 在頁表中取出相應(yīng)的PTE
- 新取出的PTE放在TLB中,可能會覆蓋一個已經(jīng)存在的條目
-
頁表不命中(Page fault)
-
操作系統(tǒng)獲得控制權(quán),控制的轉(zhuǎn)移由異常機制完成
-
必須在下一集存儲器層次中找到該頁(通常是閃存或磁盤),然后決定將其放到主存中
-
選擇近期內(nèi)不會被使用的頁進行替換(LRU,最少使用替換策略)
-
LRU算法
完全準(zhǔn)確執(zhí)行LRU代價太高,大多數(shù)OS通過跟蹤哪些頁最近被使用哪些沒有來近似地實現(xiàn)LRU算法
提供一個引用位(reference bit/use bit),當(dāng)一頁被訪問時該位被置位。
OS定期將引用位清零,然后再重新記錄,來判定在這段特定時間內(nèi)哪些頁被訪問過
-
假定某一頁在很長一段時間都沒有被訪問,那么該頁再被訪問的可能性比最近經(jīng)常訪問的頁的可能性要小,被替換的頁寫入磁盤的交換區(qū)(Swap space)。
-
Swap space
由于我們無法提前獲知存儲器的某一頁什么時候會被替換出去,因此OS在創(chuàng)建進程的時候會在閃存或者磁盤上為進程中所有的頁創(chuàng)建空間(Swap space)
-
-
存儲器層次結(jié)構(gòu)的全部操作
存儲器層級結(jié)構(gòu)由一個TLB和一個cache組成。一次存儲器訪問可能遇到三種不同類型的確實:TLB缺失、缺頁以及cache缺失。
最好的情況下,虛擬地址由TLB進行轉(zhuǎn)換,然后被送到cache找到相應(yīng)的數(shù)據(jù),取回并送入處理器。
最壞的情況下,訪問在存儲器層次結(jié)構(gòu)的TLB、頁表和cache這三個部件中都發(fā)生缺失。
總結(jié)
以上是生活随笔為你收集整理的【计算机基础】 Virtual memory 虚拟内存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【ML】Principle Compon
- 下一篇: 【计算机基础】 操作系统总结(未完)