虚拟存储器
操作系统:一种控制应用程序运行和在计算机用户与计算机硬件之间提供接口的程序,目标:使计算机使用起来更方便,允许计算机系统的资源以有效的方式使用
存储器管理:早期主存:系统软件和一个用户程序;现在:操作系统和若干个用户程序
如何将更多更大的任务装入主存?
- 增大主存容量
- 分区分页
- 虚拟存储器
虚拟存储器:每次访问仅将当前需要的页面调入主存,其他不活跃的页面放在外存磁盘上
分区方式
1、系统区:固定的地址范围内,存放操作系统
2、用户区:存放所有用户程序
- 简单固定分区:用户区划分成长度不等的固定长的分区;任务调入主存时分配可以容纳他的最小分区。(优点:简单;缺点:浪费主存空间)
- 可变长分区:用户区按每个任务需要的内存大小分配(提高主存利用率,但是存储器碎片会越来越多)
分页
目的:减少碎片的产生
基本思想:主存分成固定长且比较小的存储块
- 页框:主存中的存储块,固定长度比较小
- 页:任务的程序块,固定长
- 需要将页装入页框中
地址分为:
- 物理地址:实际主存中的地址
- 逻辑地址:指令中的地址
虚拟存储器:在外部存储器(硬盘)中开辟一块区域存放程序,并且仅将这里面当前需要的页调入主存中。虚拟存储器使用的是虚拟地址。页调入主存的过程为“请求分页”。
- 请求分页:需要将逻辑地址转化为物理地址,这一过程是通过查页表实现的
流程:
- 第一步:将任务中的所有程序代码写入硬盘中
- 第二步,将部分需要使用的页先调入主存中
- 第三步:当使用主存中的页时,如果没有命中,就从硬盘中调入新的页;如果一个页被替换且已经被修改过,就将该页从主存中写回硬盘中
类型:
- 分页式虚拟存储器
- 分段式虚拟存储器
- 段页式虚拟存储器
分页式虚拟存储器
主存和虚拟地址中的空间都被划分为了大小相等的页面。
- 虚拟页:又称逻辑页,指的是虚拟地址空间中的页面(位于硬盘中)
- 物理页:又称页框,指的是主存空间中的页面
为了方便将一个虚拟页映射到一个物理页,我们使用了页表
页表:保存了所有虚拟页的信息。
每个页表中的每一行中包含:虚拟页的存放位置(在硬盘中,主存中或者null)、装入位(valid,表示是否装入到了主存中),修改位(表示页表中的数据是否被修改,供写回使用)、存取权限位等等
注意:页表是被保存在主存中的。
地址也分为虚拟地址和物理地址
- 虚拟地址组成:虚拟页号+页内偏移量
- 物理地址组成:物理页号+页内偏移量
页表的作用:将一个虚拟地址映射到一个物理地址。(虚拟页号+页内偏移量->物理页号+页内偏移量)其实两个地址的页内偏移量是完全相同的,所以页表中只是将虚拟页号映射到了一个物理页号,然后拼接上原本的页内偏移量就是新的物理地址
此处,如果装入位为1,那么存放位置指向主存中的地址;如果装入位为0,且存放位置不为null,那么这个地址指向磁盘存储器中的地址
注意:页表是没有类似Cache的标记位的。当拿到一个虚拟地址并取出其中的虚拟页号时,这个虚拟页号是几,就查询页表的第几行
分页式执行程序:先启动硬盘中存储的程序,将运行时程序载入到硬盘中,然后再将需要的页载入内存中,记录在页表中。当想要使用硬盘中数据时,可以先查询页表,如果未命中再访问硬盘,并将数据载入到内存和页表中
TLB
为了减少访问主存的次数,使用了快表TLB,将页表中最活跃的几项复制到Cache中。只有当TLB未命中时,才会去访问主存中的页表。
Cache真正的访问过程:
一开始给出的是虚拟地址,然后先查询TLB
- 如果TLB有,就可以直接取出,将虚拟地址转换为物理地址,然后进入和之前Cache一样的流程
- 如果TLB没有,就去查页表。如果页表有,那么也是转换成物理地址然后交给Cache处理;如果没有,就比较麻烦了,就是缺页,那么就需要像Cache未命中一样,从硬盘中调入对应的页,再更新页表和TLB。
注意:正常情况下不会出现:根据虚拟页号查询页表时,页表对应项装入位为0,但是对应的存放位置为null的情况。
TLB Cache 页表的缺失情况
分段式虚拟存储器
将程序和数据分成不同长度的段,将所需的段加载到主存中
虚拟地址:段号 + 段内偏移量
分页式虚拟存储器
- 优点:实现简单、开销少
- 缺点:一个数据或一条指令可能会分跨在两个页面
分段式虚拟存储器:
- 优点:段的分界与程序的自然分界相对应,易于编译、管理、修改和保护
- 缺点:段的长度不固定(引起碎片)
段页式虚拟存储器
将程序和数据分段,段内再进行分页(每个分段都有一个页表)
虚拟地址:段号 + 页号 + 页内偏移量
- 优点:程序按段实现共享与保护
- 缺点:需要多次查表