虚拟存储器

1. 虚拟存储器机制

  虚拟存储器即对磁盘存储器进行抽象,将磁盘存储器组织成一个连续的存储器,将主存看成是磁盘存储器的一个高速缓存。

  虚拟存储器提供了三个重要的能力:

 (1)将主存看成是磁盘存储器的高速缓存,在主存中只保存活动区域,并根据需要在主存和磁盘之间来回传送数据,有效地提高了主存的利用率

 (2)为每个进程提供了一致的地址空间,大大简化了存储器的管理

 (3)为每个进程提供了独立的存储空间,保护进程不受破坏

2. 虚拟存储器作为主存的缓存

 虚拟存储器将磁盘存储器分割成多个块(虚拟页),将主存也分割成多个块(物理页,也叫页帧),并且这两种块的大小一致。

 虚拟页被分成三类:

  已缓存,即这些虚拟页已经被缓存到主存中;

  未缓存,这些虚拟页已经分配了磁盘存储空间,但没有缓存在主存中;

  未分配,这些虚拟页还没有分配磁盘存储空间,没有和任何数据相关联;

  主存作为虚拟存储器的高速缓存,是全相联的,即任意一个虚拟页可以缓存在任意一个页帧中。而且由于对磁盘的访问比较费时,主存总是采用写回法来保存缓存更新到磁盘。

3. 页表

 CPU执行程序时采用的是虚拟地址,即从可执行文件中读取的是虚拟地址,需要由地址翻译单元(MMU)结合页表将虚拟地址翻译成物理地址,进而找到保存在主存中的内容。

 页表保存了虚拟页到页帧的映射关系,虚拟存储器系统需要根据页表来判断所需的虚拟页是否缓存在主存中,实现虚拟地址的翻译以及发现缓存不命中时如何进行页面替换等。页表由多个页表条目组成,每个页表条目都包含一个有效位以及一个地址字段:

有效位 地址
0 null
1 0101
0   1010

有效位标识该虚拟页是否被缓存在主存中,如果已经缓存在主存中,则地址字段就是该虚拟页缓存在主存中的地址;如果还没有缓存在主存中,地址字段为空,则表示该虚拟页尚未分配虚拟存储空间,否则地址字段就是虚拟页在磁盘存储器的地址。

  页表常驻在主存中,操作系统为每个进程都维护一个单独的页表。当虚拟页缓存在主存中时即表示页命中,若没有缓存在主存中即表示缺页,系统会产生缺页异常,然后将虚拟页从磁盘拷贝到主存中。

4. 虚拟存储器简化了存储器管理

  操作系统为每个进程维护一个独立的页表,即每个进程都一个独立的虚拟地址空间,这为存储器管理提供了很多便捷:

  (1)简化链接

  独立的地址空间允许每个进程的存储器映像具有相同的基本格式,比如目标文件中.text节的起始地址可以相同,这些相同的虚拟地址可以映射到不同的实际物理地址中。这样的一致性简化了链接器的设计和实现,允许链接器生成完全链接的可执行文件,这些可执行文件中的地址是和最终执行时在主存中的地址完全独立的。

  (2)简化加载

  加载器加载可执行文件时,操作系统为该进程分配新的虚拟页和页表,并初始化页表中的映射关系。加载器加载可执行文件时并没有立即将代码和数据从磁盘拷贝到主存中,而是当这些虚拟页第一次被请求时由操作系统将虚拟页调入到主存中。

  (3)简化共享

  多个进程有时需要共享一些相同的代码和数据,如:系统内核的一些代码和数据、系统库函数。操作系统通过将多个不同的进程的虚拟页映射到相同的物理页,实现多个进程共享相同的代码和数据,而不是为每个进程都拷贝一份到主存中。

  (4)简化存储器分配

  当程序请求动态分配额外的存储空间时(例如调用malloc函数),操作系统只需要分配若干个连续的虚拟页,然后将这些虚拟页映射到主存中的页帧,而不需要实际为程序分配连续的页帧。

5. 地址翻译

  CPU寻址时采用虚拟地址,CPU中存在一个页表基址寄存器,指向当前页表。虚拟地址包括虚拟页号以及页面偏移量,CPU中的地址翻译单元结合页表将虚拟地址翻译成物理地址:

 

  

参考资料 《深入理解计算机系统》

原文地址:https://www.cnblogs.com/jqctop1/p/4754285.html