操作系统虚拟存储器

Posted 天秤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统虚拟存储器相关的知识,希望对你有一定的参考价值。

相关文章:

【操作系统】存储器管理

【操作系统】处理机调度简述

【操作系统】之进程管理

【操作系统】经典的同步问题(生产者消费者问题, 哲学家进餐问题, 读写问题)

内存的容量有限, 如果有大作业或大量作业运行, 内存就会不够用. 为解决这一问题边催生了虚拟存储器的概念.

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

  1. 一次性 
    作业必须一次性地全部装入内存后才能开始运行.
  2. 驻留性 
    作业被装入内存后, 整个作业都一直驻留在内存中, 其中任何部分都不会被换出, 直至作业运行结束.

局部性原理 
由1968年P.Denning提出: 在较短的时间内, 程序的执行仅局限于某个部分, 相应地, 它所访问的存储空间也局限于某个区域. 
他提出了几个论点:

  1. 程序执行时, 除了少部分的转移和过程调用指令外, 在大多数情况下是顺序执行的.
  2. 过程调用将会使用程序执行轨迹由一部分区域转至另一部分区域.
  3. 程序中存在许多循环结构, 这些结构虽然只有少数指令构成, 但是他们将被多次执行.
  4. 程序中号包括许多对数据结构的处理, 这写往往都局限在很小的范围内.

局限性还表现在时间和空间方面

  • 时间局限性 
    由于程序中存在大量循环操作, 那么某些指令(数据)在不久之后会再次被执行(访问).
  • 空间局限性 
    程序在一段时间内访问的地址可能集中在一定的范围内, 比如程序的顺序执行.

虚拟存储器

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

特征

  1. 多次性. 一个作业中的程序和数据无需再作业运行时一次性全部装入内存, 而是允许被分成多次调入内存运行. (只需当前要运行的部分程序和数据装入内存即可)
  2. 对换性. 一个作业中的程序和数据, 无须在作业运行时一直常驻内存, 而是允许在作业的运行过程中进行对换操作.(在进程运行期间, 将有用的程序或数据换入, 无用的则换出)
  3. 虚拟性. 能够从逻辑上扩充内存容量. 提高内存利用率 

    虚拟性是以多次性和对换性为基础的.


虚拟存储器可以通过请求分页, 请求分段的方法实现, 它们都需要软硬件支持, 主要硬件有页(段)表机制, 缺页(段)中断机构, 地址变换结构

请求分页存储管理方式

请求页表

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

分为页号, 物理块号, 状态位P, 访问字A段, 修改位M, 外存地址 
状态位(存在位)P: 由于该字段只有一位, 又称位字. 用于指示该页是否已调入内存, 供程序访问时参考. 
访问字段A: 用于记录本也在一段时间内被访问的次数, 或记录本页最近已有多长时间未被访问. 
修改位M: 标识该页在调入内存后是否被修改过. 
外存地址: 用于指出该页在外存的地址.

缺页中断机构

每当要访问的页面不再内存时, 便产生依次缺页中断, 请求OS将所缺之页调入内存.

  • 指令在执行期间产生和处理中断信号
  • 一条指令在执行期间可能产生多次缺页中断

地址变换结构

Alt text

内存分配

最小物理块数 
最小物理块数能保证进程正常运行, 它取决于指令的格式, 功能和寻址方式.

内存分配策略 
内存在进行分配时可以采取固定分配和可变分配.

  • 固定分配, 为每个进程分配一组固定数目的物理块, 在进程运行期间不可更改.
  • 可变分配, 为每个进程分配一定数目的物理块, 在进程运行期间可以更改.

页面置换时可以采取全局置换和局部置换.

  • 全局置换, 如果进程在运行期间返现缺页, 则将OS所保留的空间物理块取出一块分配给该进程, 或者以所有进程的全部物理块为标的, 选择一块换出, 然后将所缺之页调入.
  • 局部置换, 如果进程在运行中发现缺页, 则只能从分配给该进程的n个页面中选出一页换出, 然后在调入一页, 以保证分配给该进程的内存空间不变.

通过以上可以组合一下三种策略:

  1. 固定分配局部置换 
    为每个进程分配多少物理块是根据进程类型(交互型或批处理型)或根据程序员的建议来确定.
  2. 可变分配全局置换 
    凡是产生缺页的物理块, 都将获得新的物理块.
  3. 可变分配全局置换 
    为每个进程分配一定数目的物理块, 但当某进程发现缺页时, 只允许从该进程在内存的页面中选择一页换出.

物理块分配算法

  1. 平均分配算法. 将系统中所有可供分配的物理块平均分配给各个进程.
  2. 按比例分配算法. 根据进程大小按比例分配物理.假设系统中有n个进程, 每个进程页面数为, 则系统中页面数总和为

     

    . 物理总块数为m, 则每个进程能分到的物理块数

     

    .
  3. 考虑优先权的分配算法. 一部分按比例分配, 一部分根据进程的优先权分配

页面置换算法

最佳置换算法(Optimal)

OPT算法淘汰以后不使用或者在最长(未来)时间内不再被访问的页面

最佳置换算法有最好的性能当无法实现, 通常用它作为标准评价其他算法

先进先出置换算法(First In First Out)

淘汰最先进入内存的页面, 即在内存中驻留时间最久的页面.

最久未使用置换算法(Least Recently Used)

淘汰最近最久未使用的页面

最少使用置换算法*(Least Frequently Used)

淘汰最近时期使用最少的页面.

LFU算法的页面访问图和LRU算法的页面访问图完全相同

时钟置换算法(Clock)

为每页设置一位访问位, 再将内存中的所有页面都通过链接指针链接成一个循环队列. 当某页被访问时, 其访问位被置1. 置换算法在选择一页淘汰时, 只需检查页的访问位. 如果是0, 就选择该页换出; 若为1, 则重新将它置0, 暂不换出; 再按照FIFO算法检查下一个页面. 当检查到队列中的最后一个页面时, 若其访问位仍为1, 则再返回到队首去检查第一个页面.

Alt text

改进Clock算法 
淘汰的页面即是未使用过的页面, 又是未被修改过的页面. 
由访问位A和修改位M可以组合成下面四种类型的页面:

  • 1类(A=0, M=0): 表示该页最近既未被访问, 又未被修改, 是最佳淘汰页.
  • 2类(A=0, M=1):表示该页最近未被访问, 但已被修改, 并不是很好的淘汰页.
  • 3类(A=1, M=0):最近已被访问, 但未被修改, 该页有可能再被访问.
  • 4类(A=1, M=1):最近已被访问且被修改, 该页可能再被访问.

其执行过程分为以下三步:

  1. 从指针所指当前位置开始, 扫描循环队列, 寻找A=0且M=0的页面, 将遇到的第一个页面作为淘汰页. 在第一次扫描期间不改变访问位A.
  2. 如果第一步失败, 即查找一轮后未遇到的第一类页面, 则开始第二轮扫描, 寻找A=0且M=1的页面, 将所遇到的第一个这类页面作为淘汰页. 在第二轮扫描期间, 将所有扫描过的页面的访问位置都置0.
  3. 第二步也失败, 亦即未找到第二类页面, 则将指针返回到开始的位置, 并将所有的访问位复0. 然后重复第一步. 若果仍失败, 必要时重复第二步, 此时就一定能找到被淘汰的页.

改进的Clock算法可减少磁盘的I/O操作次数, 但是系统开销会增加.

页面分配策略

  • 何时调入页面

    1. 预调入策略 
      将在不久之后便会被访问的页面预先调入内存
    2. 请求调入策略 
      当进程所访问的页面不再内存中时, 便立即请求, 由OS将所需页面调入内存.
  • 从何处调入页面

    1. 若系统由足够的对换区, 则从对换区调入. 否则从文件区调入.
    2. UNIX方式: 未运行国的页面从文件区调入, 运行过的页面从对换区调入(运行过的页面已被换出至对换区)
  • 缺页率 
    即, 访问失败页面的次数与总访问数之比. 
    S为访问页面成功的次数, F为方位失败的次数. 则缺页率为

     

抖动

抖动现象: 在系统中的进程太多, 需要频繁的进行进程的对换操作, 以至于占用太多时间, 从而处理机的利用率下降并趋于0的情况, 我们称之为抖动. 通常用工作集来避免抖动

工作集是在某段时间内, 进程实际索要访问的页面集合. 我们将这些页面又称为活跃页面.

预防抖动的方法

  1. 采取局部置换策略
  2. 工作集算法融入处理机调度
  3. 调节缺页率
  4. 暂停进程

请求分段存储管理方式

请求段表

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

分为段名, 段长, 段基地址, 存取方式, 访问字段A, 修改位M, 存在位P, 增补位, 外存地址

  1. 存取方式, 该字段为两位, 可执行(00), 可读(01), 可写(11)
  2. 访问字段A, 记录该段的访问次数
  3. 修改位M, 表示该页调入内存后是否已被修改过
  4. 存在位P, 指示本段是否已调入内存
  5. 增补位, 特有字段, 表示本段在运行过程中是否做过动态增长.
  6. 外存始址, 指示本段在外存中的起始地址, 即起始盘块号.

缺段中断机构

Alt text

地址变换机构

Alt text

以上是关于操作系统虚拟存储器的主要内容,如果未能解决你的问题,请参考以下文章

如何将 r ggplot 图存储为 html 代码片段

sql 这些代码片段将演示如何逐步使用PolyBase。你应该有一个blob存储和存储秘密方便

在Tomcat的安装目录下conf目录下的server.xml文件中增加一个xml代码片段,该代码片段中每个属性的含义与用途

显示 ActionBar 选项卡的两个片段

如何向 ViewPager 提供许多片段并避免错误代码?

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段