一)虚拟存储技术
1)基本概念
定义:当进程在运行时,先将其一部分装入内存,另一部分暂留在磁盘,当要执行的指令或访问的数据不在内存时,
由操作系统自动完成将它们从磁盘调入内存的工作
虚拟地址空间:分配给进程的虚拟内存
虚拟地址:在虚拟内存中指令或数据的位置,该位置可以被访问,仿佛它是内存的一部分
虚拟内存——建立在存储体系之上,一部分在内存,一部分在磁盘
把内存与磁盘有机地结合起来使用,从而得到了一个容量很大的“内存”,即虚存
虚存是对内存的抽象,构建在存储体系之上,由操作系统协调各存储器的使用
在虚存中,速度与CPU的取址速度相当,但是虚存提供了一个比物理内存空间大得多的地址空间
虚存的大小受到了计算机系统的寻址机制和磁盘空间中的可用空间的限制(32位计算机虚拟地址空间最大可达到2^32,
即4G)
地址保护:确保每个进程有独立的地址空间
确保进程访问合法的地址范围(防止地址越界)
确保进程的操作是合法的(防止访问越权)
2)虚拟页式(PAGING)
虚拟存储技术+页式存储管理方案——》虚拟页式存储管理系统
a.基本思想:进程开始运行之前,不是装入全部页面,而是装入一个或零个页面
之后,根据进程运行的需要,动态装入其他页面
当内存空间已满,而又需要装入新的页面时,则根据某种算法置换内存中某个页面,以便装入新的页面
b.通常有两种形式:请求调页(demand paging)
预先调页(preparing)
以CPU的时间和磁盘空间换取昂贵内存空间,这是操作系统中的资源管理技术
二)页表及页表项的设计
1)页表表项的设计(通常是硬件设计的)
a.页表由页表项组成
页框号(内存块号,物理页面号、页帧号)
有效位(驻留位、中断位):表示该页是在内存还是在磁盘(0-没有读进内存,这时候页框号无效)
访问位:引用位(当要使用这一页时,由硬件将这一位设置为1)
修改位:此页在内存中是否被修改过(修改过后硬件自动设为1)
保护位:读/可读写
b.32位虚拟地址空间的页表规模(页面大小为4K,页表项大小为4字节)
则:一个进程地址空间有?页 2^20页(一个页面有一个页表项,于是有2^20个页表项,一个页面可以放4K/4 = 1K个页表项)
其页表需要占?页(页表页)1024(即每个进程需要1024个页表页)
页表页在内存中若不连续存放,则需要引入页表页的地址索引表——》页目录(Page Directory)
每个进程一个
通过页目录找到页表,再通过页表项形成真正的物理地址
当一个进程上CPU的时候,它的页目录起始地址被推送上寄存器;当进程下CPU时,这个地址会保存在这个进程的PCB相关的现场信息里
虚拟地址——》
因为页面大小是4K,所以页内地址(偏移)是占12位,页框号一分为二
2)引入反转(倒排)页表
地址转换从虚拟地址出发:虚拟地址——》查页表——》得到页框号——》形成物理地址
每个进程一张表(占用很多空间)
解决思路:从物理地址出发,系统建立一张页表(只有一张页表)
页表项记录进程i的某虚拟地址(虚页号)与页框号的映射关系
问题:因为一个系统只有一张表,查找工作很大
解决(哈希表):将虚拟地址的页号部分映射到一个散列值
散列值指向一个反转页表
反转页表大小与实际内存成固定比例,与进程个数无关
三)地址转换过程及TLB引入
1)MMU(内存管理单元):将CPU取到的虚拟地址转换为物理地址
2)快表(TLB)的引入
问题:页表——》两次或两次以上的内存访问
CPU的指令处理速度与内存指令的访问速度差异大,CPU的速度得不到充分利用
程序访问的局部性原理——》引入快表(TLB)
TLB——Translation Look-aside Buffers
在CPU中引入的高速缓冲(Cache),可以匹配CPU的处理速率和内存的访问速度
由随机存储型存储器组成,除连线寻址机制外,还有连线逻辑,能按特定的匹配标志在一个存储周期内对所有的字同时进行比较
又称为相联存储器(associative memory),成本昂贵,容量有限
按内容并行查找
保证正在运行的进程的页表的子集(部分页表项)
位置:在CPU片上
四)页错误(PAGE FAULT)
1)又称页面错误、页故障、页面失效
是指地址转换过程中硬件产生的异常
具体原因:缺页异常——》所访问的虚拟页面没有调用物理内存
页面访问违反了权限(读/写、用户/内核)
错误的访问地址
……
2)缺页异常处理
在地址映射过程中,硬件检查页表时发现所要访问的页面不在内存,则产生该异常——缺页异常
操作系统执行缺页异常处理程序:获得磁盘地址,启动磁盘,将该页面调入内存
如果内存中有空闲页框,则分配一个页框,将重新调入页装入,并修改页表中相应页表项的有效位及相应的页框号
若内存中没有空闲页框,则要置换内存中某一页框;若该页框内容被修改过,则要将其写回磁盘
最后可以加一点预取页面的功能
五)软件相关策略
1)驻留集:指的是操作系统给每个进程分配多少页框
a.固定分配策略:进程创建时确定,可以根据进程类型(交互、批处理、应用类)或者基于程序员或者系统管理员的需要来确定
b.可变分配策略:根据缺页率评估进程局部性表现
缺页率高——》增加页框数
缺页率低——》减少页框数
系统开销
2)置换问题
a.置换范围:计划置换页面的集合是局限在产生缺页中断的进程,还是所有进程的页框
局部置换策略:仅在产生本次缺页的进程的驻留集中选择
全局置换策略:将内存中所有未锁定的页框都作为置换的候选
固定分配局部置换、可变分配局部置换、可变分配全局置换
可变分配局部置换:
当一个新的进程进入内存时,给它分配一定数目的页框,然后填满这些页框
当发生一次缺页异常时,从产生缺页异常进程的驻留集中选择一页用于置换
不断重新评估进程的页框分配情况,增加或减少分配给它的页框,以提高整体性能
b.置换策略:在计划置换的页框集合中,选择换出哪一个页框
所有决策的目标——》置换最近最不可能访问的页
根据局部性原理,最近的访问历史和最近将要访问的模式间存在相关性,因此大多数策略都基于过去的行为来预测将来的行为
约束:不能置换被锁定的页框
页框锁定
采用虚存技术后:开销——》使进程运行时间变得不确定
给每个页框增加一个锁定位
通过设置相应的锁定位,不让操作系统将进程使用的页面换出内存,避免产生由交换过程带来的不确定延迟
例如:操作系统核心代码、关键数据结构、I/O缓冲区
c.清除策略
清除:从进程的驻留集中收回页框
虚拟页式系统工作的最佳状态:发生缺页异常时,系统中有大量的空闲页框
结论:在系统中保存一定数目的空闲页框供给比使用内存并在需要时搜索一个页框有更好的性能
基本思想:设计一个分页守护进程(paging daemon),多数时间睡眠着,可定期唤醒以检查内存状态
如果空闲页框过少,分页守护进程通过预定的页面置换算法选择页面置换算法选择换出内存
如果页面装入内存后被修改过,则将它们写回磁盘分页守护进程可保证所有的空闲页框是“干净”的
当进程需要使用一个已置换出的页框时,如果该页框还没有被新的内容覆盖,将它从空闲页框集合中移除即可恢复该页面
页缓冲技术:不丢弃置换出的页,将它们放入两个表之一:如果未被修改,则放到空闲页链表中,如果修改了,则放到
修改页链表中
被修改的页定期写回磁盘(不是一次只写一个,大大减少I/O操作的数量,从而减少了磁盘访问时间)
被置换的页仍然保留在内存中, 一旦进程又要访问该页,可以迅速将它加入该进程的驻留集合(代价很小)
六)页面置换算法
又称页面淘汰(替换)算法
1)最佳页面置换算法(OPT)
设计思想:置换以后不再需要的或最远的将来才会用到的页面
最为一种标准来衡量其他算法的性能
2)先进先出算法(FIFO)
设计思想:选择在内存中驻留时间最长的页并置换它
实现:页面链表法
缺点:将常用但现进入的页面置出
FIFO页面置换算法会产生异常现象(Belady现象),即:当分配给进程的物理页面数增加时,缺页次数反而增加
3)第二次机会算法(SCR)
按照先进先出算法选择某一页面,检查其访问位R,如果为0,则置换该页;如果为1,则给第二次机会,并将访问位置0
缺点:增加开销(页面在给第二次机会时移动的开销)
4)时钟算法(CLOCK)
5)最近未使用算法(NRU)
设计思想:选择在最近一段时间内未使用过的一页并置换
实现:设置页表表项的两位:访问位(R),修改位(M)
启动一个进程时,R,M位置0,R位被定期清零
发生缺页中断时,操作系统检查R,M:
第一类:无访问,无修改;第二类:无访问,有修改
第三类:有访问,无修改;第四类:有访问,有修改
算法思想:随机从编号最小的非空类中选择一页置换
时钟算法的实现:从指针的当前位置开始,扫描页框缓冲区,选择遇到的第一个页框( r=0; m=0)用于置换(本扫描过程中,对使用位不做任何修改)
如果第1步失败,则重新扫描,选择第一个( r=0;m=1)的页框(本次扫描过程中,对每个跳过的页框,将其使用位设置成0)
如果第2步失败,指针将回到它的最初位置,并且集合中所有页框的使用位均为0。重复第1步,并且,如果有必要,重复第2步。这样将可以找到供置换的页框
6)最近最少使用算法(LRU):
选择最后一次访问时间距离当前时间最长的一页并置换,即置换未使用时间最长的一页
性能接近OPT
实现时间戳或维护一个访问页的栈——》开销大
7)最不经常使用算法(NFU)
选择访问次数最少的页面置换
LRU的一种软件解决方案
实现:软件计数器,一页一个,初值为0
每次时钟中断时,计数器加R
发生缺页中断时,选择计数器值最小的一页置换
8)老化算法(AGING)
改进(模拟LRU):计数器加R前先右移一位,R位加到计数器的最左端
9)工作集算法
影响缺页次数的因素:页面置换算法
a.页面本身的大小
页面尺寸问题
确定页面尺寸大小对于分页的硬件设计非常重要,而对于操作系统是个可选参数
要考虑的因素:内部碎片、页表长度、辅存的物理特性
多页面尺寸:为有效使用TLB带来灵活性,但给操作系统带来复杂性
b.程序的编制方法
c.分配给进程的页框数量
颠簸(Thrashing,抖动):虚存中,页面在内存与磁盘间频繁调度,使得调度页面所需得时间比进程实际运行得时间还多,这样导致系统效率急剧下降,这种现象称为颠簸或抖动
工作集(WORKING SET)模型
基本思想:根据程序的局部性原理,一般情况下,进程在一段时间内总是集中访问一些页面,这些页面称为活跃页面,如果分配给一个进程的物理页面太少了,使该进程所需的活跃页面不能全部装入内存,则进程在运行过程中将频繁发生中断
如果能为进程提供与活跃页面数相等的物理页面数,则可能减少缺页中断次数
工作集:一个进程当前正在使用的页框集合
工作集W(t,n) = 该进程在过去n个虚拟时间单位中访问到的页面的集合
内容取决于:访问序列特性
时刻t
工作集窗口长度(n)窗口越大,工作集越大
工作集算法
基本算法:找出一个工作集的页面并置换它
思路:每个页表项中有一字段:记录该页面最后一次被访问时间
设置一个时间T
判断:根据一个页面的访问时间是否落在“当前时间 - T”之前或之中决定其在工作集之外还是之内
实现:扫描所有页表项,执行操作
1. 如果一个页面的R位是1,则将该页面的最后一次访问时间设为当前时间,将R位清零
2. 如果一个页面的R位是0,则检查该页面的访问时间是否在“当前时间-T”之前
(1) 如果是,则该页面为被置换的页面;
(2) 如果不是,记录当前所有被扫描过页面的最后访问时间里面的最小值。扫描下一个页面并重复1、 2
七)其他相关技术
1)内存映射文件
a.基本思想:进程通过一个系统调用(mmap)将一个文件(或部分)映射到其虚拟地址空间的一部分,访问这个文件就像访问内存中的一个大数组,而不是对文件进行读写
在多数实现中,在映射共享的页面时不会实际读入页面的内容,而是在访问页面时,页面才会被每次一页的读入,磁盘文件则被当作后备存储
当程序退出或显示解除文件映射时,所有被修改页面会写回文件
2)支持写时复制技术
新复制的页面对执行写操作的进程是私有的,对其他共享写时复制页面的进程时不可见的