虚拟存储器概述
计算机能执行比主存空间大的程序吗?
虚拟存储器只是一个容量非常大的存储器的逻辑模型,不是任何实际的物理存储器。它借助于磁盘等辅助存储器来扩大主存容量,使之为更大或更多的程序所使用。虚拟存储器指的是主存-外存层次,它以透明(透明的含义是:看不见,感觉不到)的方式为用户提供了一个比实际主存空间大得多的程序地址空间。
虚拟存储器的一个重要用途是解决计算机中主存的容量问题,在不明显降低平均访问速度的前提下增加程序的访问空间
实地址和虚地址
用户编写程序时使用的地址(虚拟地址由编译程序生成)称为虚地址或逻辑地址,其对应的存储空间称为虚存空间或逻辑地址空间;而计算机物理内存的访问地址则称为实地址或物理地址,其对应的存储空间称为物理存储空间或主存空间。程序进行虚地址到实地址转换的过程称为程序的再定位。
虚拟地址的访问过程
- 由CPU送入虚拟地址,通过查表看虚拟地址对应的单元内容是否装入主存
- 如果在主存,通过辅助软硬件自动把虚拟地址变换为主存地址(物理地址)后,对主存相应单元进行访问
- 如果不在主存,通过辅助软硬件讲虚拟地址对应的内容调入主存中,然后进行访问
特点
- 每个程序的虚地址空间可以远大于实地址空间,也可以远小于实地址空间
- 有了虚拟机制后,应用程序就可以透明地使用整个虚存空间
- 每个程序就可以拥有一个虚拟的存储器,它具有辅存的容量和接近主存的访问速度
cache与虚存的异同
相同点
- 两者都是为了提高存储系统的性能价格比,即使存储系统的性能接近高速存储器
- 都是基于程序局部性原理。一个程序运行时,只会用到程序和数据的一小部分,仅把这部分放到比较快速的存储器中即可,其他大部分放在速度低、价格便宜、容量大的存储器中,这样可以以较低的价格实现较高速的运算
不同点
- 在虚拟存储器中未命中的性能损失要远大于Cache系统中未命中的损失。因为主存和Cache的速度相差5~10倍,而外存和主存的速度相差上千倍
- cache主要解决主存与CPU的速度差异问题,而虚存主要解决存储容量问题
- CPU与cache和主存之间均有直接访问通路,cache不命中时可直接访问主存。而虚存所依赖的辅存与CPU之间不存在直接的数据通路,当主存不命中时只能通过调页解决,CPU最终还是要访问主存
- cache的管理完全由硬件完成,对系统程序员和应用程序员均透明。而虚存管理由软件(操作系统)和硬件共同完成,虚存对实现存储管理的程序员是不透明的(段式和段页式管理对应用程序员”半透明“)
页式虚拟存储器
页式虚拟存储器:把主存储器和虚拟存储器都划分成固定大小的一页(Page)
主存储器的页称为实页,虚拟存储器中的页称为虚页
逻辑地址由$A+B$位组成,物理地址由$a+b$位组成,由于二者的页面大小相同,因此$b=B$
页表:在内存中用一部分空间来存储内存块的目录文件。每个逻辑页在页表内有一行记录
页表的构成:有效位、物理页号...(至少要有这两条)
有效位:表示此逻辑页是否已存储在主存中
物理页号:表示该逻辑页在主存中所对应的物理页号
页表的行数由逻辑页的数量决定
转换后援缓冲器(TLB)
由于页表通常在主存中,因而即使逻辑页已经在主存中,也至少要访问两次物理存储器才能实现一次访存,这将使虚拟存储器的存取时间加倍
为了避免对主存访问次数的增多,可以对页表本身实行二级缓存,把页表中的最活跃的部分存放在高速存储器中。这个专用于页表缓存的高速存储器部件通常称为转换后援缓冲器(TLB),又称为快表。而保存在主存中的完整页表则称为慢表。快表的作用是加快地址变换
快表和慢表之间的关系,相当于主存和cache之间的关系
段式虚拟存储器
在段式虚拟存储器中,段是按照程序的逻辑结构划分的,各段的长度因程序而异
段表的每一个行对应一个段。每行至少包含下面三个字段:
- 有效位:该段是否已经调入主存
- 段起位:在该段已经调入主存的情况下,该段在主存中的首地址
- 段长:记录该段的实际长度(为了保证访问某段的地址空间时,段内地址不会超出该段长度导致地址越界而破坏其他段)
段表也是一个段
段页式虚拟存储器
段式虚拟存储器和页式虚拟存储器的结合
- 实存被等分成页
- 先段后页,每个程序先按逻辑结构分段,每段在按照实存页的大小分页,程序按页进行调入和调出操作,但可按段进行编程、保护和共享
每道程序均通过一个段表和多个页表进行两级再定位。段表中的每一个表项对应一个段,每个表项有一个指针指向该段的页表。页表则指明该段各页再主存中的位置,以及是否已装入、是否已修改等状态信息
666