老狗——虚拟存储管理

虚拟存储管理

  • 一. 虚拟存储器的基本概念
      • 1. 常规存储器管理方式的特征
      • 2. 程序执行的局部性:
      • 3. 虚拟存储器的定义
      • 4. 虚拟存储管理
      • 5. 虚拟存储器的特征
  • 二. 请求分页式存储管理方式
      • 1. 硬件支持
      • 2. 页表的基本功能不变:逻辑地址映射为物理地址
      • 3.缺页中断机构:
      • 4.地址变换机构
      • 5.内存分配
  • 三.页面置换算法
      • 1. 缺页率=页面调入次数(缺页次数)/总的页面使用次数
      • 2. 最佳Optimal置换算法
      • 3. 先进先出置换算法(FIFO)
      • 4. 最近最久未使用置换算法(LRU)
      • 5. 轮转算法(clock)
      • 6. 其他置换算法
        • 最少使用 (LFU, Least Frequently Used)
        • 页面缓冲算法PBA(page buffering algorithm)
      • 7. 虚拟存储管理下访问内存的有效时间
      • 8. 影响缺页率的主要因素
      • 9. 抖动
  • 四.请求分段存储管理方式
      • 1. 硬件支持
      • 2. 分段的共享和保护

一. 虚拟存储器的基本概念

1. 常规存储器管理方式的特征

  • 一次性:作业在运行前一次性地全部装入内存
  • 驻留性:作业装入内存后,便一直驻留在内存中,直至作业运行结束。

2. 程序执行的局部性:

  • 时间局部性
    被引用过一次的存储器位置很可能在不远的将来再被多次引用。
  • 空间局部性
    如果一个存储器位置被引用了一次,那么程序很可能在不远的将来引用附近的一个存储器位置。

3. 虚拟存储器的定义

是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。

虚拟存储管理下

  • 内存逻辑容量由内存容量和外存容量之和所决定
  • 运行速度接近于内存速度
  • 每位的成本却接近于外存。

4. 虚拟存储管理

允许将一个作业分多次调入内存。

  • 若采用连续分配方式,需申请足够空间,再分多次装入,造成内存资源浪费,并不能从逻辑上扩大内存容量。
  • 虚拟的实现建立在离散分配存储管理基础上
    方式:请求分页/请求分段系统
    细节:分页/段机构、中断机构、地址变换机构、软件支持

5. 虚拟存储器的特征

离散分配方式是基础

  • 多次性:一个作业被分成多次调入内存运行
  • 对换性:允许在作业的运行过程中进行换进、换出。(进程整体对换不算虚拟)
  • 虚拟性:能够从逻辑上扩充内存容量,使用户所看到的内存容量远大于实际内存容量。

二. 请求分页式存储管理方式

  • 基本分页 + “请求调页”和“页面置换”功能。
  • 换入和换出基本单位都是长度固定的页面

1. 硬件支持

一台具有一定容量的内/外存的计算机 + 页表机制 + 缺页中断机构 + 地址转换机构

2. 页表的基本功能不变:逻辑地址映射为物理地址

页号 物理块号 状态位P 访问字段A 修改位M 外存地址

状态位P:指示该页面是否已调入内存 (调入内存1,否则0)

访问字段A :用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问。(置换时考量的参数)

修改位M :该页在调入内存后是否被修改过。(关系到置换时调出的具体操作)

外存地址:用于指出该页在外存上的地址。

3.缺页中断机构:

每当要访问的页面不在内存时,便产生一缺页中断通知OS,OS则将所缺之页调入内存。

作为中断,需经历几个步骤:

  1. “保护CPU环境”
  2. “分析中断原因”
  3. “转入缺页中断处理程序”
  4. “恢复CPU环境”等。

4.地址变换机构

分页系统地址变换机构的基础上增加:

  • 产生和处理缺页中断(请求调入)
  • 从内存中换出一页的功能(置换)

老狗——虚拟存储管理_第1张图片
老狗——虚拟存储管理_第2张图片

5.内存分配

① 物理块的分配策略

  • 固定分配、局部置换

    为每个进程分配一定数目的物理块,在整个运行期间不再改变(基于进程的类型,或根据程序员、程序管理员的建议)

    运行中缺页时,只能从该进程内存中n个页面中选出一页换出,然后再调入一页。

  • 可变分配、全局置换

    先为每个进程分配一定数目的物理块

    OS管理一个空闲物理块队列,发生缺页时,系统从队列中取出一块分配给该进程,将欲调入的页装入(动态增长型,全局空闲空间都可分配使用)

    空闲空间不足时,可与其他任何进程页面置换。

    会使其他进程缺页率提高,影响运行

  • 可变分配、局部置换

    为每个进程分配一定数目的物理块

    缺页时,只允许换出该进程在内存的页面,不影响其他进程执行。

    根据缺页率增减进程的物理块数:若频繁缺页中断,则系统再为进程分配若干物理快;若缺页率特别低,则适当减少分配给该进程的物理块。

② 物理块的分配算法

固定分配策略时,分配物理块可采用以下几种算法:

  • 平均分配算法
    将所有可供分配的物理块平均分配给各进程。
    缺点:未考虑各进程本身的大小,利用率不均。
  • 按比例分配算法
    根据进程的大小按比例分配物理块。
  • 考虑优先权的分配算法
    实际应用中,要照顾重要、急迫的作业尽快完成,为它分配较多的内存空间。
    所有可用物理块分两部分: 一部分按比例分配给各进程;另一部分根据各进程优先权,适当地为其增加份额,分配给各进程。

三.页面置换算法

1. 缺页率=页面调入次数(缺页次数)/总的页面使用次数

2. 最佳Optimal置换算法

换出以后永不再用的,或在最长(未来)时间内不再被访问的页面。作为参照标准,评价其他算法。

3. 先进先出置换算法(FIFO)

先进入的先淘汰,即选择内存中驻留时间最久的页面予以淘汰。(队列)

优点:实现简单,把一进程已调入内存的页面按先后次序组织成一个队列,并设置一个指针(替换指针),使它总是指向队首最老的页面。

不足:与进程实际运行规律不相适应(较早调入的页往往是经常被访问的页,频繁被对换造成运行性能降低)

Belady现象:出现分配的页面数增多,缺页率反而提高的异常现象。
Belady现象的原因:FIFO算法的置换特征与进程访问内存的动态特征矛盾,即被置换的页面并不是进程不会访问的。

4. 最近最久未使用置换算法(LRU)

LRU置换算法选择最近最久未使用(least recently used)的页面予以淘汰。

不足:

  • 有时页面过去和未来的走向之间并无必然的联系。
  • 相应的需较多的硬件支持:记录每个页面自上次被访问以来所经历的时间t,淘汰时选择页面t值最大的;以及需要快速地知道哪一页是最近最久未使用的页面,用寄存器或栈。

① 寄存器记录时间的原理

  • 页面被访问后的操作:将该页对应的寄存器的Rn-1位置为1
  • 如何记时:
    由系统发出定时信号,每隔一定时间将所有寄存器右移1位。
    某一时刻,比较各寄存器的值,被用到的标志1逐渐往低位上积累,若高位上没有1,就说明最近没用过。所以最近最久未使用的就是寄存器值最小的那个页。

② 栈记录时间的原理
某页面被访问,便将该页面的页面号从栈中移出,将它压入栈顶。因此:栈顶始终是最新被访问页面的编号,越久未使用,页面越被压在栈底。

5. 轮转算法(clock)

又称 —— 最近未使用算法(NRU, Not Recently Used)

  • 每个页设一个使用标志位(use bit),若该页被访问则将其置为1。
  • 设置一个指针,从当前指针位置开始按地址先后检查各页,寻找use bit=0的页面作为被置换页。
  • 若指针经过的页use bit=1,修改use bit=0(暂不凋出,给被用过的页面驻留的机会 ),指针继续向下。到所有页面末尾后再返回队首检查。

改进

  • 主要考虑对没访问过的页面再细分是否修改过的不同情况,减少因修改造成的频繁I/O操作。
  • 每页除记录是否用过A,还记录是否修改的标志M。置换时根据两个标志的值有4种不同情况的处理。

6. 其他置换算法

最少使用 (LFU, Least Frequently Used)

每页设置访问计数器,每当页面被访问时,该页面的访问计数器加1;
缺页中断时,淘汰计数值最小的页面,并将所有计数清零;

页面缓冲算法PBA(page buffering algorithm)

  • 仍用FIFO算法选择被置换页但并不将其马上换入外存。
  • 系统将页面放入两个链表之一:如果页面未被修改,就将其归入到空闲页面链表的末尾;否则将其归入到已修改页面链表。
    需要调入新的物理页面时,将新页面内容读入到空闲页面链表的第一项所指的页面,然后将第一项删除(从空闲链表摘下)。
  • 空闲页面和已修改页面,仍停留在内存中一段时间,如果这些页面被再次访问,只需较小开销,而被访问的页面可以返还作为进程的内存页。
  • 当已修改页面达到一定数目后,再将它们一起调出到外存,然后将它们归入空闲页面链表,这样能大大减少I/O操作的次数。

7. 虚拟存储管理下访问内存的有效时间

请求分页管理方式下,存在三种方式的内存访问

  • 页在内存,且快表检索命中
    EAT= λ + t
  • 页在内存,但快表检索没有命中
    EAT= 快表检索时间+访问页表时间+修改更新快表时间+访问页面物理内存时间
    = λ +t+ λ +t
    =2*(λ+t)
  • 页面不在内存
    EAT=快表检索时间+访问页表时间+缺页中断处理时间+修改更新快表时间+访问页面物理内存时间
    = λ+ t + ε + λ + t
  • 加入概率的综合公式(a是快表命中率,f是缺页率)
    EAT= λ + at +(1-a){ }
    = λ +at +(1-a){t + f*(ε+λ+t) +(1-f)*(λ+ t) }

8. 影响缺页率的主要因素

  • 分配给作业的主存块数:多则缺页率低,反之则高。
  • 页面大小:大则缺页率低;反之则高。
  • 页面调度算法:对缺页中断率影响很大,但不可能找到一种最佳算法。
  • 程序编制方法:
    以数组运算为例,如果每一行元素存放在一页中,则按行处理各元素缺页中断率低;反之,按列处理各元素,则缺页中断率高。
    老狗——虚拟存储管理_第3张图片

9. 抖动

系统抖动:

  • 为了提高处理机利用率,可增加多道程序并发度;
  • 但进程数目增加过多,每个进程分配得到的物理块太少,在某个临界点上,会出现刚被淘汰的页很快又需重新调入;而调入不久又被淘汰出去;出现频繁缺页
  • 大部分处理器时间都用在来回的页面调度上,这种局面称为系统抖动或颠簸(thrashing)

抖动的后果:

  • 缺页率急剧增加
  • 内存有效存取时间加长,
  • 系统吞吐量骤减;系统已基本不能完成什么任务,而是忙于页面对换操作,cpu虽然忙,但效率急剧下降。

根本原因:

  • 页面淘汰算法不合理;分配给进程的物理页面数(驻留集)太少。

常用防抖动方法:

  • 局部置换策略;
  • 页面调入内存前检查各进程工作集,为缺页率高的增加有限物理块;
  • L缺页间的平均时间=S置换一个页面所需时间,可使磁盘和cpu达到最大利用率;
  • 抖动发生时选择暂停一些进程,调节多道程序度。

工作集: 某段时间间隔中,进程实际要访问的页面的集合。

驻留集 > 工作集 可使进程顺利的运行。

驻留集

  • 驻留(常驻)集是指在当前时刻,进程实际驻留在内存当中的页面集合。
  • 工作集是进程在运行过程中固有的性质,而驻留集取决于系统分配给进程的物理页面数目,以及所采用的页面置换算法;
  • 如果一个进程的整个工作集都在内存当中,即驻留集 ⊇ 工作集,那么进程将很顺利地运行,而不会造成太多的缺页中断(直到工作集发生剧烈变动,从而过渡到另一个状态);
  • 当驻留集达到某个数目之后,再给它分配更多的物理页面,缺页率也不会明显下降。

四.请求分段存储管理方式

1. 硬件支持

① 段表机制

段名 段长 段的基址 存取方式 访问字段A 修改位M 存在位P 增补位 外存始址

存取方式 :用于标识本分段的存取属性。R,R/W,W

访问字段A :用于记录本段被访问的频繁程度

修改位M :表示该段在调入内存后是否被修改过

存在状态位P :指示该段是否已调入内存

增补位 :特有字段,表示该段运行中是否做过动态增长

外存地址:用于指出该段在外存上的起始地址(盘块号)

② 缺段中断机构

发现运行进程所访问段尚未调入内存

  • 由缺段中断机构产生一缺段中断信号
  • 进入OS,由缺段中断处理程序将所需的段调入内存。
  • 缺段中断同样在一条指令的执行期间产生和处理中断,一条指令执行可能产生多次缺段中断。但不会出现一条指令被分割在两个分段中或一组信息被分割在两个分段中的情况。

③ 地址变换机构

基于分段系统地址变换机构的基础

  • 段调入内存
  • 修改段表
  • 再利用段表进行地址变换。

总之:就是增加了缺段中断的请求及处理等功能

2. 分段的共享和保护

  • 实现共享:共享段表
  • 共享段如何分享与回收
  • 分段保护

你可能感兴趣的:(操作系统)