• 《现代操作系统》—— 第8章 存储模型(二) 虚拟存储技术


      相比于前一部分,本章介绍页式存储管理系统中的软件策略,主要内容是对进程页(虚拟页)的管理,并介绍典型页面置换算法

    1. 虚拟存储技术:当进程运行时,先将其一部分装入内存,另一部分暂留在磁盘,当要执行的指令或访问的数据不在内存时,由操作系统自动完成将它们从磁盘调入内存的工作。把内存与磁盘有机地结合起来使用,从而得到一个容量很大的内存,即虚存。虚存是对内存的抽象,构建在存储体系之上,由操作系统协调和存储器的使用。
    2. 虚拟页式存储管理系统(PAGING)
      • 概念:页式存储管理方案 + 虚拟存储技术 -> 虚拟页式存储管理系统
      • 基本思想:
        • 进程开始运行之前,不是装入全部页面,而是装入一个或零个页面
        • 之后,根据进程运行的需要,动态装入其他页面
        • 当内存空间已满,而又需要装入新的页面时,则根据某种算法置换内存中的某个页面,以便装入新的页面
      • 分为两种方式:请求调页、预先调页
      • 实质:是一种以CPU时间和磁盘空间换取昂贵内存空间,是操作系统中一种资源转换技术
    3. 页表及页表项设计:
      • 页表由页表项组成
      • 页表项通常包括:
        • 页框号(内存块号)
        • 有效位:该页式在内存还是在磁盘
        • 访问位:是否被访问过——页面置换算法中常利用该位
        • 修改位:此页在内存中是否被修改过
        • 保护位:读/写权限
      • 通常,由于地址转换是硬件通过访问页表来进行,因此页表项是由硬件设计的
      • 页表页:页表由许多页表项组成,因此也需要存储空间,存储页表的页称为页表页。32位系统中,一个进程的地址空间有2^20页也就需要2^20个页表项,由于页表项大小为4字节,而每页的大小为4K,则每页能够容纳1024个页表项,因此一个进程需要占用1024个页表页。对于64位系统,一个进程占用32000TB的页表空间。
      • 页目录:由于页表占用空间较大,因此一般不连续存放,那么就需要引入页表页的地址索引表,即页目录。有了页目录就变成了二级页表结构,如下图。二级页表结构只能表示4GB的虚拟地址空间,如果超过4GB则需要更多的目录层级。
      • 反转页表(倒排页表)
        • 背景:从虚拟地址空间出发,每个进程都需要一张页表,由于内存中同时存在多个进程,并且每个进程的页表占用空间也较大,因此需要巨大的空间来存放页表
        • 解决思路:
          • 从物理地址空间出发,系统建立只一张页表(从物理内存出发,由于物理地址的大小的固定的,因此页表项的数量是固定的,即页表的大小也是固定的,这样就只需要一张页表,而不像从虚拟地址空间出发为每个进程都建立一张页表)
          • 页表项记录的是进程p的某虚拟地址(页号)与页框号的映射关系
        • 反转页表的实现:通常将虚拟地址的页号作为键值key,将物理地址作为散列值value,形成hash映射。散列值指向反转页表中的某个位置。
        • 反转页表的优点:其大小与实际内存大小成固定比例,与进程个数无关,占用空间小
    4. 快表:
      • 快表的引入:
        • 由于页目录的存在,对页表的访问通常需要2次及以上的内存访问次数
        • CPU的指令处理速度与内存的访问速度相差较大,CPU的速度无法得到充分利用
        • 于是,为了加快地址映射速度,引入了快表(TLB)
      • 快表是什么:
        • 在CPU中引入的高速缓存,可以匹配CPU的处理速度和内存访问速度,解决二者访问速度相差较大的矛盾
        • 具体是一种随机存取型存储器,能按特定的匹配标志在一个存储周期内对所有的字同时进行比较
        • 由于快表所用的存储器较为昂贵,因此快表一般都很小,只能保存少量的页表项
      • 快表如何工作:根据程序访问的局部性原理,保存正在运行进程的页表的子集(部分页表项)
      • 引入页表项后的地址转换过程示意:
    5. 页错误(Page Fault)
      • 概念:地址转换过程中硬件产生的异常
      • 原因:
        • 所访问的虚拟页面没有调入物理内存——缺页异常
        • 页面访问违反权限
        • 错误的访问地址
        • ......
      • 缺页异常的处理:
        • 操作系统执行缺页异常处理程序
        • 如果内存中有空闲页框,则分配一个页框,然后修改相应页表项的有效位等
        • 如果内存中没有空闲页框,则要置换内存中某一页框,具体置换哪些页框取决于置换算法
    6. 虚拟页式存储管理中的软件相关策略:
      • 驻留集
        • 概念:一个进程的驻留集是指进程拥有的页框的集合,驻留集的大小是指:给进程分配的页框数
        • 驻留集分配策略:
          • 固定分配策略:进程创建时确定
          • 可变分配策略:根据缺页率动态增减页框数
      • 置换问题:当内存中没有空闲页框时,需要将某些页框内容置换出去以得到可用页框
        • 置换范围:计划置换的页面集合是局限在当前产生缺页中断的进程,还是所有进程的页框?
        • 置换策略:在置换范围内,选择换出哪一个页框?
      • 根据驻留集分配策略和置换策略可以有三种策略组合:固定分配局部置换、可变分配布局置换、可变分配全局置换。以可变分配布局置换为例:
        • 当一个新进程装载入内存时,给它分配一定数目的页框,然后填满这些页框
        • 当发生一次缺页异常时,从产生缺页异常的进程的驻留集中选择一个页框用于置换
        • 不断重新评估进程的页框分配情况,增加或减少分配给它的页框以提高整体性能(根据缺页率)
      • 置换策略:决定置换当前内存中的哪一个页框
        • 所有置换策略的目标:置换最近最不可能访问的页,一般都基于过去的行为预测将来的行为
        • 悖论:置换策略设计的越精细,越复杂,实现的软硬件开销就越大
        • 注意:不能置换被锁定的页框
        • 页框锁定:
          • 通过设置相应的锁定位,不让操作系统将进程使用的页面换出内存,避免产生由交换过程带来的不确定的延迟
          • 通常需要锁定的页面:操作系统核心代码,关键数据结构,IO缓冲区
      • 清除策略(页框回收)
        • 虚拟页式存储系统工作的最佳状态:发生缺页异常时,系统内有大量的空闲页框(这就是为什么电脑内存越大,运行越快的原因。比如,2G内存能够运行某个软件,但是剩余内存空间较少,发生缺页时可供使用的空闲页框较少,因此运行缓慢;而换成4G内存后由于会剩余更多的空闲内存,因此运行更快)
        • 操作系统一般都会有一个分页守护进程(paging daemon)定期检查内存状态,当发现空闲页框过少时,会通过置换算法换出某些页框,从而得到空闲页框
        • 页缓冲技术:当进程需要使用一个已置换出的页框时,如果该页框还没有被新的内容覆盖,将它从空闲页框集合中移出即可恢复页面
    7. 典型的页面置换算法:
      • 最佳页面置换算法(OPT):置换以后不再需要或将来很远才能用到的页面。该算法只是作为一种标准来衡量其他算法的性能
      • 先进先出算法(FIFO):选择在内存中驻留时间最长的页面并置换它。FIFO会产生BELADY现象,即:给进程分配的页框越多,发生缺页异常的次数反而增加。
      • 第二次机会算法(SCR):按照先进先出算法选择某一页面,检查其访问位R,如果为0,则置换该页面;如果为1,则给第二次机会,将访问位R置1.


      • 时钟算法:对第二次机会算法在实现上的优化,将链表换成环形数组,提高操作效率


      • 最近未使用算法(NRU):选择在最近一段时间内未使用过的一页进行置换
        • 实现:利用页表项中的访问位R和修改位M来选择最近未使用的页
        • 该算法也可以使用时钟算法进行优化
      • 最近最少使用算法(LRU):选择最后一次访问时间距离当前时间最长的一页并置换。性能接近OPT,但由于时间戳的引入,开销较大。
      • 最不经常使用算法(NFU):选择访问次数最少的页面置换
        • LRU的一种软件解决方案
        • 实现:
          • 软件计数器,每页一个,初值为0
          • 每次时钟中断时,计数器数值加R(访问位)
          • 发生缺页异常时,选择计数器值最小的一页进行置换
      • 老化算法(Aging):在NFU的基础上进行改进
        • 计数器在加R前先右移一位,R位加到计数器的最左端。右移是对计数器数值的衰减,而R位加到最左端则表示较大的权重
      • 工作集算法:
        • 影响缺页次数的因素:
          • 页面置换算法
          • 页面本身的大小
          • 程序的编制方法
          • 分配给进程的页框数量
        • 颠簸(Thrashing):虚存中,页面在内存和磁盘间频繁调度,使得调度页面所需时间比进程实际运行时间还多,这样导致系统效率急剧下降,这种现象称为颠簸或抖动
        • 工作集算法的基本思想——局部性原理:根据程序的局部性原理,一般情况下,进程在一段时间内总是集中访问某些页面,这些页面被称为活跃页面,如果分配给一个进程的物理页面(页框)太少,使该进程的活跃页面不能全部装入内存,则进程在运行过程中将频繁发生中断;如果能为进程提供与活跃页面数相等的物理页面数,则可减少缺页中断的次数。该算法由Denning在1968年提出。
        • 工作集:一个进程当前正在使用的页框的集合。工作集的大小是不断变化的,进程的驻留集根据工作集的大小随时调整。
        • 实现的基本思路:找出一个不在工作集中的页框并置换它
        • 实现的具体思路:
          • 每个页表项有一个字段,记录该页面最后一次被访问的时间
          • 设置一个时间值T
          • 判断:根据一个页面的访问时间是否落在“当前时间-T”之前或之中,决定其在工作集之外还是之内
      • 页面置换算法小结:


  • 相关阅读:
    C++ 根据对象名字创建对象
    Google是如何测试的(一)
    lex yacc 学习
    C语言宏定义时#(井号)和##(双井号)的用法
    更多编译器对C++11的支持比较
    用C++11替代Boost的实验之三
    最先进的开源游戏引擎KlayGE 4.2发布
    各编译器对C++11的支持比较
    在Android模拟器上的一些小陷阱
    推出KlayGE Foundation Library
  • 原文地址:https://www.cnblogs.com/uestcliming666/p/13246885.html
Copyright © 2020-2023  润新知