虚拟存储:逻辑地址转换为物理地址、缺页中断、置换策略、补充、页式虚拟存储、段氏虚拟存储、段页式虚拟存储

虚拟存储,在逻辑上扩充了内存容量,但实际上内存(也称主存)的物理空间大小不变。逻辑容量由内存容量和外存容量之和决定。外存和内存的数据交换主要有操作系统完成。

基于局部性原理(时间、空间),现在访问的信息将来可能仍会访问,现在访问的信息附近的将来可能会访问,因此产生了高速缓冲存储器Cache和虚拟存储。

传统的存储,程序一次性装入内存,并驻留在内存中,直到程序运行结束。

虚拟存储中,程序装入时,程序中很快用到的部分调入内存,暂时用不到的先留在外存。(允许被分成多次调入内存,称为多次性)

程序执行中,将要用到的部分不在内存时,由操作系统负责从外存调入内存;若内存空间不够,操作系统按一定的策略将暂时用不到的数据甚至进程从内存换出到外存。(允许从内存调出、需要时再调入内存,称为对换性)

在操作系统的管理下,用户感觉上内存容量比实际的大,这就是虚拟内存。(称为虚拟性)

因此,虚拟存储具有请求调入功能和置换功能。

一、地址映射(以分页虚拟存储为例)

地址映射:虚拟地址 转换成 物理地址 的过程。

逻辑地址(虚地址):程序员视角看到的地址。地址可拆分为:逻辑页号(虚页号) + 页内地址。

物理地址(实地址):实际在内存中的地址。地址可拆分为:主存块号(实页号) + 页内地址。

通过内存管理单元(MMU)硬件将逻辑地址转换为物理地址。操作系统负责将逻辑地址和物理地址的映射关系维护在页表中。

1、页表

页表在主存中,访问主存速度慢,页表也称慢表,是一种特殊的数据结构,由页表项组成,每一行就是一个页表项,就对应一个页面。

页表项的内容:逻辑页号、主存块号(主存地址)、外存块号(外存地址)、有效位(是否调入内存,也有称状态位)、访问字段(访问次数或多久没被访问)、脏位(是否修改过,也有称修改位)等。

        逻辑页号:在逻辑上操作系统将程序分成若干个大小相同的页面(Page),页面大小与主存块大小相同,每个页面都有一个编号,就是逻辑页号。

        访问字段:记录被访问的次数或者多久没有被访问,为置换页面策略提供参考。

虚拟存储:逻辑地址转换为物理地址、缺页中断、置换策略、补充、页式虚拟存储、段氏虚拟存储、段页式虚拟存储_第1张图片

页面大小:页内地址n位,页面大小为2^{n}

页表项个数:页号m位,页表项个数为2^{m}

页表大小:页表项个数 * 页表项大小

一个程序对应一个页表,但若程序太大,且不一定每个页面都会用到,需要多级页表。

页表基地址寄存器存储的就是最高页表(即4级页表)的物理地址。除了最低页表(即1级页表),每一个页表的页表项中存储着对应的下一级页表起始地址。最低页表(即1级页表)的页表项中存储着对应的主存地址(主存块号)。

虚拟存储:逻辑地址转换为物理地址、缺页中断、置换策略、补充、页式虚拟存储、段氏虚拟存储、段页式虚拟存储_第2张图片

 2、快表(TLB)

TLB(Translation Lookaside Buffer,简称快表),是慢表(页表)的一部分副本。

快表是CPU中的独立硬件MMU(内存管理单元)的一部分,由SRAM制成,是相联存储器(按内容寻找)。

3、逻辑地址转为物理地址

先检查页号的合法性,页号是否越界(即页号是否小于等于页表长度)?若越界,产生越界中断;若没有越界,继续查找。

在快表中,根据逻辑号查找,若命中,则已在内存中,根据页表项的主存块号和页内地址拼接得到物理地址(实际主存地址)。

若快表没命中,在页表中,根据页表基址寄存器中的页表基地址(指明在哪张页表中)和逻辑号查找,若对应页表项的有效位为1,说明已经调入内存,根据页表项的主存块号和页内地址拼接得到物理地址(实际主存地址),并把页表项复制到快表。

若页表中页表项的有效位为0,说明还没有调入内存,则产生缺页中断,操作系统将数据从外存调入内存,并修改页表、将页表项复制到快表中。

补充:访问主存:根据物理地址,先在Cache中查找,若命中,直接从Cache读取数据。若Cache没命中,从内存读取数据,同时将数据调入Cache。

虚拟存储:逻辑地址转换为物理地址、缺页中断、置换策略、补充、页式虚拟存储、段氏虚拟存储、段页式虚拟存储_第3张图片

 

二、缺页中断

当在快表和慢表均没有找到对应主存块号,说明还没有调入内存,将发出缺页中断,由操作系统的缺页中断处理程序来处理中断,操作系统将从外存把数据调入内存。

若主存中有空闲块,将所缺页面调入该块,修改页表中对应的页表项,并将页表项复制到快表。

若主存中没有空闲块,将按照一定的置换策略将某些页面替换掉。若被替换的页面修改过,需写回到外存。

缺页中断,属于内中断中的故障。因当前指令想要访问的页面未调入主存导致的,且有可能被故障处理系统修复。一条指令可能产生多次缺页中断。

缺页中断时,缺页的进程进入阻塞状态,放入阻塞队列,调页完成后再将进程唤醒,放入就绪队列。

虚拟存储:逻辑地址转换为物理地址、缺页中断、置换策略、补充、页式虚拟存储、段氏虚拟存储、段页式虚拟存储_第4张图片

三、置换策略

1、最佳置换算法(无法实现)

OPT,Optimal。把未来最长时间不被访问的页面替换掉。

可以保证最低的缺页率,但操作系统无法提前预知页面访问序列,只有程序运行过程中才能知道接下来将要访问哪些页面,因此该算法无法实现。

2、先进先出置换算法(FIFO)

先调入内存的页面先被替换掉。

简单,易于实现,但性能差,会产生Belady异常(当为进程分配的主存块更多时,缺页次数反而增加的异常现象)

3、最近最久未使用置换算法(LRU)

LRU,Least Recently Used。

页表项的访问字段记录上次被访问到现在的时间间隔t,把t最大的页面替换掉。

算法性能好,最接近最佳置换算法,但需专门的硬件支持,实现困难,开销大。

4、时钟置换算法(CLOCK)

将主存中的页面通过链接指针链接成一个循环队列。

每个页表项都有一个访问字段。当页面被访问,该页表项的访问字段为1。

置换时,检查各页表项的访问字段。若访问字段为0,将其替换掉;若访问字段都为1,将访问字段置为0,检查下一个页表项;若页表项的访问字段都为1,则检查完一圈后,访问字段都已置为0,第二圈检查,可以将第一个访问字段为0的页面替换掉。

可能会扫描2遍,且最多被扫描2遍。但被替换的页面若修改过,需要写回到外存,需要执行I/O操作,若没有修改过,就不需要执行I/O操作写回到外存。因此,有改进型的时钟置换算法。

5、改进型的时钟置换算法

在置换时,考虑访问字段和修改位,在其他条件相同的情况下,优先替换掉没有修改的页面。

最多被扫描4遍。用(访问字段,修改位)的形式表示页面状态。

第1遍:将第1个(0,0)的页面替换掉。(即 没有访问过、没有修改过的页面)

第2遍:重新扫描。将访问字段置为0,检查下一个页表项,将第1个(0,1)的页面替换掉。(即 没有访问过、但修改过的页面)

第3遍:重新扫描。将第1个(0,0)的页面替换掉。(即 访问过、但没有修改过的页面)

第4遍:重新扫描。将第1个(0,1)的页面替换掉。(即 访问过、且修改过的页面)

虚拟存储:逻辑地址转换为物理地址、缺页中断、置换策略、补充、页式虚拟存储、段氏虚拟存储、段页式虚拟存储_第5张图片

补充、页式虚拟存储、段氏虚拟存储、段页式虚拟存储

虚拟存储有:页式虚拟存储、段氏虚拟存储、段页式虚拟存储。

页式虚拟存储 段氏虚拟存储 段页式虚拟存储
将程序分成若干个页(Page) 将程序分成若干个段 将程序分成若干个段,段内再分成若干个页
页面大小相同 段长不同 段长不同,段内页面大小相同
操作系统以“页”为单位调入调出 操作系统以“段”为单位调入调出 操作系统以“页”为单位调入调出
虚拟地址:页号和页内地址 虚拟地址:段号和段内地址 虚拟地址:段号、段内页号和页内地址
每个程序对应一个页表 每个程序对应一个段表(多一个段长项,并记录段的起始地址) 每个程序对应一个段表、每个段表对应一个页表
主存分成大小相同的页 主存不需要分页分块 主存分成大小相同的页

你可能感兴趣的:(计算机,笔记)