1.快表地址变换机构
快表,又称联想寄存器(TLB,translation lookaside buffer ),是一种访问速度比内存快很多的高速缓存(TLB不是内存!),用来存放最近访问的页表项的副本,可以加速地址变换的速度。与此对应,内存中的页表常称为慢表。
快表工作流程:
- 进程切换时,清空TLB内容。
- 获取进程访问逻辑地址的页号和页内偏移量
- 通过页号先查找快表,如果没命中,就要访问内存中的页表。如果命中了,直接就找到了内存块号地址。
- 根据页表查找到内存块号地址,并且将这份信息复制一份给快表。
- 通过内存块号和页内偏移量计算物理地址。
快表如果命中,就不需要去内存中找页表,节约了地址转化时间。
如果快表满了,会通过一种置换算法切换快表值。
TLB和普通Cache的区别:TLB中只有页表项的副本,而普通Cache中可能会有其他各种数据的副本
2. 两级页表
单级页表问题:
- 进程需要的页表常驻内存连续空间比较大,没有必要让整个内存常驻内存。
可将长长的页表进行分组,使每个内存块刚好可以放入一个分组。再将这些分组离散的分开到各个内存块上。
要为离散分配的页表再建立一张页表,称为页目录表,或称外层页表,或称顶层页表
在两级页表下,将逻辑地址转化为物理地址步骤:
- 按照地址结构将逻辑地址拆分成三部分
- 从PCB中读出页目录表始址,再根据一级页号查页目录表,找到下一级页表在内存中的存放位置
- 根据二级页号查表,找到最终想访问的内存块号
- 结合页内偏移量得到物理地址
同时:可以在需要访问页面时才把页面调入内存(虚拟存储技术)。可以在页表项中增加一个标志位,用于表示该页面是否已经调入内存。
若想访问的页面不在内存中,则产生缺页中断(内中断),然后将目标页面从外存调入内存。
需要注意:
- 若采用多级页表机制,则各级页表的大小不能超过一个页面
- 两级页表的访存次数在不考虑快表时,访存3次才能访问到目的物理地址(速度变慢)
- N级页表访问一个逻辑地址需要N+1次访存
3. 虚拟内存的基本概念
传统存储管理方式的特征、缺点:一次性,驻留性
一次性:作业必须一次性全部装入内存后才能开始运行。这会造成两个问题
- 作业很大时,不能全部装入内存,导致大作业无法运行;
- 当大量作业要求运行时,由于内存无法容纳所有作业,因此只有少量作业能运行,导致多道程序并发度下降。
驻留性:一旦作业被装入内存,就会一直驻留在内存中,直至作业运行结束。
事实上,在一个时间段内,只需要访问作业的一小部分数据即可正常运行,这就导致了内存中会驻留大量的、暂时用不到的数据,浪费了宝贵的内存资源。
根据局部性原理,上述问题可以通过虚拟内存技术解决。
虚拟内存概念:
基于局部性原理,在程序装入时,可以将程序中很快会用到的部分装入内存,暂时用不到的部分留在外存,就可以让程序开始执行。
在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。
虚拟内存三个主要特征:
- 多次性:无需在作业运行时一次性全部装入内存,而是允许被分成多次调入内存。
- 对换性:在作业运行时无需一直常驻内存,而是允许在作业运行过程中,将作业换入、换出。
- 虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存容量,远大于实际的容量。
虚拟内存技术,允许一个作业分多次调入内存。如果采用连续分配方式,会不方便实现。
因此,虚拟内存的实现需要建立在离散分配的内存管理方式基础上。
虚拟内存的实现主要有三部分:
- 请求分页存储管理
- 请求分段存储管理
- 请求段页式存储管理
在基本离散分配内存方式基础上,操作系统还要控制页或段的调入(请求调页)调出(页面置换)算法。
基本分页存储管理
页表
与基本分页管理相比,请求分页管理中,为了实现“请求调页”,操作系统需要知道每个页面是否已经调入内存,如果还没调入,那么也需要知道该页面在外存中存放的位置。
当内存空间不够时,要实现“页面置换”,操作系统需要通过某些指标来决定到底换出哪个页面
有的页面没有被修改过,就不用再浪费时间写回外存。有的页面修改过,就需要将外存中的归数据覆盖,因此,操作系统也需要记录各个页面是否被修改的信息
因此基本分页存储管理相比于页式管理内存的页表,不仅仅有页号和内存块号的对应关系。
基本分页存储管理页表还有状态位(是否调入内存),访问字段(页面置换算法),修改位(这个页的数据是否被修改),外存地址(页面被修改后要写回外存)。
缺页中断机制:
在请求分页系统中,每当要访问的页面不在内存时,便产生一个缺页中断,然后由操作系统的缺页中断处理程序处理中断。
此时缺页的进程阻塞,放入阻塞队列,调页完成后再将其唤醒,放回就绪队列。
- 如果内存中有空闲块,则为进程分配一个空闲块,将所缺页面装入该块,并修改页表中相应的页表项。
- 如果内存中没有空闲块,则由页面置换算法选择一个页面淘汰,若该页面在内存期间被修改过,则要将其写回外存。未修改过的页面不用写回外存。
缺页中断是因为当前执行的指令想要访问的目标页面未调入内存而产生的,因此属于内中断
中断:
- 内中断
Ⅰ. 陷入trap
Ⅱ. 故障
Ⅲ. 终止- 外中断
Ⅰ. IO操作
Ⅱ. 人工干预