操作系统原理读书笔记之虚拟存储技术

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ray0354315/article/details/71435250

虚拟存储技术

是指:当进程运行时,先将其中一部分装入内存,另一部分暂留在磁盘,当要执行的指令或访问的数据不在内存时,由操作系统自动完成将他们从磁盘调入内存的工作


虚存与存储体系的关系

虚存构建在存储体系之上,把内存和磁盘有机的结合起来使用,从而得到一个容量很大的内存,由操作系统协调各存储器


地址保护机制

  1. 确保每个进程有独立的地址空间
  2. 确保进程访问的地址不越界,这项功能由两个寄存器解决,一个存放进程的起始基地址,另一个存放进程地址的最大边界,访问地址时做边界判断,如果越界则陷入操作系统做异常处理
  3. 确保进程对地址的访问不越权(划分读写权限)


虚拟页式存储管理系统

结合虚拟存储技术和页式存储管理方案,就诞生了虚拟页式存储管理系统

基本思想是在进程开始运行之前,装入一个或零个页面,之后根据进程运行的需要,动态装入其他页面,当内存空间已满,而又需要装入新的页面时,根据某种交换算法置换内存中某个页面和磁盘上待装入的页。

通常有请求调页和预先调页两种方式

虚拟地址和物理地址由页表关联


页表


页表的页表项包括页框号、有效位(在内存or在磁盘)、访问位(该虚拟空间在一个时钟周期里是否进入过内存被访问)、修改位(是否在内存中被修改过,用来判定是否需要回写磁盘)、保护位(只读or可读写)

重点说明一下访问位,进程开启后,页表会一直驻存在内存中,在一个时钟周期内,页表中的部分页表项对应的地址空间会被加载进内存,这部分被加载的页对应的页表项访问位就要被置为1,在时钟中断发生时,所有该进程的页表项访问位会清0

问题1:32位虚拟地址的页表规模?假设页面大小为4k;页表项大小为4byte
在32位系统中,逻辑地址由32位组成,如果一个页面大小是4k的话,需要2^12的偏移量,剩余2^20就对应全部页号,所以一个进程地址空间可以包含2^20页,也就是说页表需要存放2^20个页表项;
一个页面大小是4k,页表项大小是4byte,则一个页面可以存放1k个页表项,那么2^20个页表项需要2^10个页面来存放

问题2:64位虚拟地址的页表规模?假设页面大小仍为4k;页表项为8byte
和问题一类似,页面大小是4k的情况下,一个逻辑地址有2^52,一个页面可以存放4k/8byte=512=2^9个页表项,2^52个页表项需要2^43个页面来存放,按每个页面4k来算的话一共是32000TB,这是一个很大的数字

因此多张页表一般不会存到一个连续的地址空间,需要一个页目录做索引,页目录地址存储在PCB中,上时间片时加载到寄存器中

二级页表结构及地址映射



core I7页表结构

I7的虚拟地址空间共有48位




现代计算机体系结构

如上所述的引入大量页表页的思路带来了空间占据较高的问题,而现代计算机体系结构不从虚拟地址空间出发,转而从物理地址空间下手,建立一张页表,而不是给每个进程都建立一套页表体系,这张页表的页表项记录进程i的虚拟地址(虚页号)与页框号的映射关系,将虚拟地址(大列表)映射到物理内存(小列表)中采用hash映射的方法,每个虚拟地址求得一个散列值指向物理内存某一地址,hash冲突采用拉链法解决


快表TLB的引入

由以上两个例子我们可以看出,在地址转换过程中,cpu会经常性的访问内存上的页,而cpu的运行速度比内存寻址快的多,将成为cpu的瓶颈,因此就引入了快表。
快表Translation Lookaside Buffer,并不是一个数据结构,而是cpu上的一块高速缓存,一种特殊的存储器,可以在一个存储周期内并行的查找,由于容量问题,快表保存正在运行进程的页表的子集(部分页表项)
引入快表后的地址转换如图所示:

虚拟地址分为虚页号(page)和偏移量,先从TLB中搜索虚页号是否存在,这个搜索过程是并行的,速度很快,如果命中,则直接得出页框号,结合偏移得到物理内存地址
如果没有命中,则查找页表,找到对应页表项后,判断有效位是否为1,表示该虚页号指向的页已被加载到内存,
否则触发缺页异常,操作系统执行缺页异常处理程序去磁盘(second memory)中将页面加载到内存中,如果
  1. 内存中有空闲页框,则分配一个页框,将页装入,并修改页表项的页框号和有效位
  2. 若没有空闲页框,需要置换内存中某一页框,若该页框被修改过,修改位会是1,需要将其写回磁盘,然后进行1的操作
完成缺页处理的工作后,再重新进行地址转换


页面置换算法

当出现缺页异常,需要置换内存中某一页框,这个页框的选择有以下算法

1、先进先出

选择内存中驻留时间最长的页置换,用队列即可实现
这种简单的算法会带来BELADY现象,即系统分配的页框数m越多,缺页次数反而会增加,举个例子:
加入页面访问顺序为1、2、3、4、1、2、5、1、2、3、4、5,当m=3时,缺页中断有9次;当m=4时,反而有10次

2、第二次机会算法

在先进先出算法基础上,检查其访问位,访问位为0,说明该页在一段时间内没有被访问,那么就置换掉;如果为1,再给一次机会,只将访问位置为0,并将这个页框从队首移到队尾

3、时钟算法

第二次机会算法有一个缺点,那就是将队列头结点移动到队尾的操作比较浪费资源,因此把队列改为头尾相接的环,通过指针的移动选择要置换的页框

4、最近未使用算法

在第二次机会算法的基础上,加入修改位的判定,这样(访问位,修改位)组合起来有四种情况,00、01、10、11,依次从小到大选择页框,用环举例,
  1. 第一步,循环先取无访问无修改的页框,
  2. 没有取到则再循环取无访问有修改的页框,这一步需要将每个跳过的页框使用位置0,(结合了第二次机会算法),
  3. 然后重复第一步的过程,如果有必要再重复第二步过程,直到取到一个符合要求的页框置换掉

5、最近最少使用算法(Last Recently Used,LRU)

选择最后一次访问时间距离当前时间最长的一页,即置换未使用时间最长的一页,软件的实现方法可以在页框内加入时间戳来记录使用时间实现,但是对页框按时间做排序相对于cpu选择页框速度太慢,出现瓶颈;采用硬件的解决思路是用矩阵,假如有4个页框,需要做一个4×4的矩阵,访问到n号页框,这个矩阵中的第n行置为1,然后将第n列置为0,如下图所示:

最后,将每一行看成一个二进制数,选择最小行,这里是第1行,那么1就是未使用时间最长的一页。显而易见这种硬件支持的算法是用空间换时间,况且如果待选页框量很大,需要一个巨大的矩阵,实际上并不可行


在LRU提出来之后,解决方案成了一个问题,在此期间,另一个算法被提了出来

6、最不经常使用算法(Not Frequently Used,NFU)

NFU最初提出声称是NRU的一种软件解决方案,但实际上思路相差甚远,NFU的基本思想是选择访问次数最少的页面置换,它给每个页设置一个软件计数器(存放在页表项中),初值0,每次时钟中断时,给这个计数器的值加上访问位的值(1或0),表示在这一个时钟周期内,这个页使用过的话就加一;当发生缺页中断时,选择计数器最小的一页进行置换

7、老化算法

老化算法在NFU基础上进行了优化,在计数器加访问位值之前先右移一位,相当于整个计数器除以2,即衰减一半,再将访问位的值加到计数器的最左端,更接近于LRU算法
展开阅读全文

没有更多推荐了,返回首页