你是否疑惑过为什么两个进程可以拥有同一个地址,明明某个地址处的物理内存只有一块啊。这其实是系统提供的一种对主存的一种抽象,叫做虚拟存储器。它为每个进程提供了一个大的、一致的、和私有的地址空间。虚拟存储器提供了三个重要的能力:1.将主存作为一个存储在磁盘上的地址空间的缓存。2.为每个进程提供一致的地址空间。3.保护每个进程的地址空间不被其他进程破坏。
虚拟地址和物理地址
CPU生成一个虚拟地址来访问主存,这个虚拟地址经过地址翻译生成适当的物理地址。物理存储器每个字节都被一个物理地址标识。
一次访问某个虚拟地址的过程
如图
第一种情况:假设要访问某个虚拟地址,此处的有效位为1,并且指向物理存储器VP2。那么我们要访问的字节肯定就在VP2这个物理页中。此次访问时页命中的。
第二种情况:假设第二次访问,虚拟地址映射到了VP3,此时页面不在物理存储器,而在磁盘,并且物理页面也已经满了,那么我们要从物理页中选择一个页面进行淘汰,将VP3调入物理内存(耗时操作)。缺页处理后如下图:
我们将VP3调入内存,将VP4调出磁盘,中断后我们再访问这个虚拟地址时,VP3已经在内存中了。
地址翻译
地址翻译将虚拟地址翻译为物理地址。虚拟地址被划分为虚拟页号和虚拟页内偏移,虚拟页号用来定位页表中的页表项,页表项中保存着物理页号,也就得到了物理页号。虚拟页偏移和物理页偏移相同。有了物理页号和物理页偏移,就得到了物理地址。
存储器映射
存储器映射提供了一种机制,可以使多个进程共享同一个对象。
如下图所示。如果一个进程将一个共享对象映射到它的虚拟地址空间的一个区域内,那么这个进程对这个区域的任何写操作,对于那些也把这个共享对象映射到它的虚拟地址空间的进程而言也是可见的。
如果某个对象是私有对象时,那么使用一种写时拷贝技术,来推迟拷贝的时间。具体过程如下图。
两个进程同时将一个私有对象映射到自己的虚拟地址空间,只要没有写操作,那么这两个进程共享内存中的同一个对象,节约了内存。当某个进程执行写操作时,因为对象是私有的,如果直接修改将会反应到另一个进程中。所以要对原对象进行拷贝,然后修改拷贝后的对象。
总结
了解了虚拟存储器,我们对进程,虚拟地址这些概念是不是理解更深刻了呢。
参考:《深入理解计算机系统》