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



 




物理和虚拟寻址



 





maxmemory 是越大越好吗 max virtual memory_maxmemory 是越大越好吗


早期CPU直接使用物理寻址


 


 


 

maxmemory 是越大越好吗 max virtual memory_运维_02


现代CPU均才用虚拟地址寻址


 


 



虚拟寻址有何好处?

 


首先,假设地址总线是n bit,则其可寻址 虚拟地址空间是[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 (已分配) 未缓存的:没有缓存在物理存储器中的已分配页。


 


maxmemory 是越大越好吗 max virtual memory_运维_03


 


 



页表 page table

 


存放在物理存储器一个数据结构,叫做页表(page table)。页表将虚拟页映射到物理页。页表就是一个PTE(page table entry,页表条目)的数组。虚拟地址空间中的每个页在页表中的一个固定偏移量处都有一个PTE。


 


PTE0 为null,无效、未分配;


PTE1 有效、已经把VP1缓存;


PTE3 已分配,未缓存?


maxmemory 是越大越好吗 max virtual memory_虚拟地址_04

 

 


页命中——读取PTE[2]可以直接从DRAM中读取


maxmemory 是越大越好吗 max virtual memory_数据结构与算法_05


 


 


 


缺页(page fault),即缓存不命中


 


缓存不命中(之前)


maxmemory 是越大越好吗 max virtual memory_运维_06


 


缓存不命中(之后)


maxmemory 是越大越好吗 max virtual memory_运维_07


 


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)。