虚拟内存 (Virtual Memory)

虚拟存储器(Virtual Memory)为每个进程提供一个大的,一致的,私有地址空间。通过一个清晰的机制,虚拟存储器提供了三个要重的能力:它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效的利用了主存;它为每个进程提供了一致的地址空间,从而简化了存储器管理;它保护每个进程的地址空间不被其他进程破坏。
 

物理和虚拟寻址
 
早期CPU直接使用物理寻址
 
 
 
现代CPU均才用虚拟地址寻址
 
 

虚拟寻址有何好处?
 
首先,假设地址总线是nbit,则其可寻址虚拟地址空间是[0-(2^n-1)]。而物理地址空间为[0 - M](比如128M或者4G)。这就说明,假设一个32bit地址总线的系统,其物理内存小于4G,但其可用虚拟地址空间依然是4G。
 
虚拟存储器作为缓存
 
概念上言,虚拟存储器被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组。每字节都有一个惟一的虚拟地址,这个惟一的虚拟地址是作为到数组的索引的。磁盘上数组的内容被缓存到主存中。和存储器层次结构中其他缓存一样,磁盘(较低层)上的数据被分成块,这些块作为磁盘和主存(较高层)之间的传输单元。VM系统通过将虚拟存储器分割成称为虚拟页(virtual page,VP)的大小固定的块,来处理这个问题。每个虚拟页的大小为P = 2^p字节。类似地,物理存储器被分割成物理页(physical page,PP),大小也为P字节(物理页也被称为页帧,page frame)。
 
在任意时刻,虚拟页面的集合都分为三个不相交的子集:
1 unallocated 未分配的:VM系统还未分配或创建的页。未分配的块没有任何数据与它们相关联,因此也就不占用任何磁盘空间。
2 cached (已分配)缓存的:当前缓存在物理存储器中的已分配页。
3 uncached (已分配)未缓存的:没有缓存在物理存储器中的已分配页。
 
 
 

页表 page table
 
存放在物理存储器一个数据结构,叫做页表(page table)。页表将虚拟页映射到物理页。页表就是一个PTE(page table entry,页表条目)的数组。虚拟地址空间中的每个页在页表中的一个固定偏移量处都有一个PTE。
 
PTE0 为null,无效、未分配;
PTE1 有效、已经把VP1缓存;
PTE3 已分配,未缓存?
 
 
页命中——读取PTE[2]可以直接从DRAM中读取
 
 
 
缺页(page fault),即缓存不命中
 
缓存不命中(之前)
 
缓存不命中(之后)
 
CPU读取 PET[3] 发现VP3并未缓存在DRAM中,触发 page fault。此时,假设DRAM缓存已满,需要一个牺牲页,就选择了牺牲PP3,PP3已经缓存了数据VP4,如果VP4已经发生了修改,需要拷贝到disk,同时需要删除从PET[4]到DRAM的指向。
然后,从disk拷贝VP3到DRAM中的pp3,PET[3]指向DRAM的pp3。
最后执行触发 page fault的指令。
 
在虚拟存储器的习惯用法中,块被称为页。在磁盘和存储器之间传送页面的活动收做交换(swapping)或者页面调度(paging)。一直等待,直到最后时刻,也就是当有不命中发生时,才换入页面的这种策略被称为换需页面调度(demand paging)。
原文地址:https://www.cnblogs.com/caca/p/OS_Virtual_Memory.html