操作系统虚拟存储器
Posted 天秤
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统虚拟存储器相关的知识,希望对你有一定的参考价值。
相关文章:
【操作系统】经典的同步问题(生产者消费者问题, 哲学家进餐问题, 读写问题)
内存的容量有限, 如果有大作业或大量作业运行, 内存就会不够用. 为解决这一问题边催生了虚拟存储器的概念.
常规存储器管理方式的特征
- 一次性
作业必须一次性地全部装入内存后才能开始运行. - 驻留性
作业被装入内存后, 整个作业都一直驻留在内存中, 其中任何部分都不会被换出, 直至作业运行结束.
局部性原理
由1968年P.Denning提出: 在较短的时间内, 程序的执行仅局限于某个部分, 相应地, 它所访问的存储空间也局限于某个区域.
他提出了几个论点:
- 程序执行时, 除了少部分的转移和过程调用指令外, 在大多数情况下是顺序执行的.
- 过程调用将会使用程序执行轨迹由一部分区域转至另一部分区域.
- 程序中存在许多循环结构, 这些结构虽然只有少数指令构成, 但是他们将被多次执行.
- 程序中号包括许多对数据结构的处理, 这写往往都局限在很小的范围内.
局限性还表现在时间和空间方面
- 时间局限性
由于程序中存在大量循环操作, 那么某些指令(数据)在不久之后会再次被执行(访问). - 空间局限性
程序在一段时间内访问的地址可能集中在一定的范围内, 比如程序的顺序执行.
虚拟存储器
- 定义
- 具有请求调入和置换功能, 能从逻辑上对内存容量加以扩充的存储器系统
特征
- 多次性. 一个作业中的程序和数据无需再作业运行时一次性全部装入内存, 而是允许被分成多次调入内存运行. (只需当前要运行的部分程序和数据装入内存即可)
- 对换性. 一个作业中的程序和数据, 无须在作业运行时一直常驻内存, 而是允许在作业的运行过程中进行对换操作.(在进程运行期间, 将有用的程序或数据换入, 无用的则换出)
- 虚拟性. 能够从逻辑上扩充内存容量. 提高内存利用率
虚拟性是以多次性和对换性为基础的.
虚拟存储器可以通过请求分页, 请求分段的方法实现, 它们都需要软硬件支持, 主要硬件有页(段)表机制, 缺页(段)中断机构, 地址变换结构
请求分页存储管理方式
请求页表
页号 | 物理块号 | 状态位P | 访问字段A | 修改位M | 外存地址 |
---|
分为页号, 物理块号, 状态位P, 访问字A段, 修改位M, 外存地址
状态位(存在位)P: 由于该字段只有一位, 又称位字. 用于指示该页是否已调入内存, 供程序访问时参考.
访问字段A: 用于记录本也在一段时间内被访问的次数, 或记录本页最近已有多长时间未被访问.
修改位M: 标识该页在调入内存后是否被修改过.
外存地址: 用于指出该页在外存的地址.
缺页中断机构
每当要访问的页面不再内存时, 便产生依次缺页中断, 请求OS将所缺之页调入内存.
- 指令在执行期间产生和处理中断信号
- 一条指令在执行期间可能产生多次缺页中断
地址变换结构
内存分配
最小物理块数
最小物理块数能保证进程正常运行, 它取决于指令的格式, 功能和寻址方式.
内存分配策略
内存在进行分配时可以采取固定分配和可变分配.
- 固定分配, 为每个进程分配一组固定数目的物理块, 在进程运行期间不可更改.
- 可变分配, 为每个进程分配一定数目的物理块, 在进程运行期间可以更改.
页面置换时可以采取全局置换和局部置换.
- 全局置换, 如果进程在运行期间返现缺页, 则将OS所保留的空间物理块取出一块分配给该进程, 或者以所有进程的全部物理块为标的, 选择一块换出, 然后将所缺之页调入.
- 局部置换, 如果进程在运行中发现缺页, 则只能从分配给该进程的n个页面中选出一页换出, 然后在调入一页, 以保证分配给该进程的内存空间不变.
通过以上可以组合一下三种策略:
- 固定分配局部置换
为每个进程分配多少物理块是根据进程类型(交互型或批处理型)或根据程序员的建议来确定. - 可变分配全局置换
凡是产生缺页的物理块, 都将获得新的物理块. - 可变分配全局置换
为每个进程分配一定数目的物理块, 但当某进程发现缺页时, 只允许从该进程在内存的页面中选择一页换出.
物理块分配算法
- 平均分配算法. 将系统中所有可供分配的物理块平均分配给各个进程.
- 按比例分配算法. 根据进程大小按比例分配物理.假设系统中有n个进程, 每个进程页面数为, 则系统中页面数总和为
- 考虑优先权的分配算法. 一部分按比例分配, 一部分根据进程的优先权分配
页面置换算法
最佳置换算法(Optimal)
OPT算法淘汰以后不使用或者在最长(未来)时间内不再被访问的页面
最佳置换算法有最好的性能当无法实现, 通常用它作为标准评价其他算法
先进先出置换算法(First In First Out)
淘汰最先进入内存的页面, 即在内存中驻留时间最久的页面.
最久未使用置换算法(Least Recently Used)
淘汰最近最久未使用的页面
最少使用置换算法*(Least Frequently Used)
淘汰最近时期使用最少的页面.
LFU算法的页面访问图和LRU算法的页面访问图完全相同
时钟置换算法(Clock)
为每页设置一位访问位, 再将内存中的所有页面都通过链接指针链接成一个循环队列. 当某页被访问时, 其访问位被置1. 置换算法在选择一页淘汰时, 只需检查页的访问位. 如果是0, 就选择该页换出; 若为1, 则重新将它置0, 暂不换出; 再按照FIFO算法检查下一个页面. 当检查到队列中的最后一个页面时, 若其访问位仍为1, 则再返回到队首去检查第一个页面.
改进Clock算法
淘汰的页面即是未使用过的页面, 又是未被修改过的页面.
由访问位A和修改位M可以组合成下面四种类型的页面:
- 1类(A=0, M=0): 表示该页最近既未被访问, 又未被修改, 是最佳淘汰页.
- 2类(A=0, M=1):表示该页最近未被访问, 但已被修改, 并不是很好的淘汰页.
- 3类(A=1, M=0):最近已被访问, 但未被修改, 该页有可能再被访问.
- 4类(A=1, M=1):最近已被访问且被修改, 该页可能再被访问.
其执行过程分为以下三步:
- 从指针所指当前位置开始, 扫描循环队列, 寻找A=0且M=0的页面, 将遇到的第一个页面作为淘汰页. 在第一次扫描期间不改变访问位A.
- 如果第一步失败, 即查找一轮后未遇到的第一类页面, 则开始第二轮扫描, 寻找A=0且M=1的页面, 将所遇到的第一个这类页面作为淘汰页. 在第二轮扫描期间, 将所有扫描过的页面的访问位置都置0.
- 第二步也失败, 亦即未找到第二类页面, 则将指针返回到开始的位置, 并将所有的访问位复0. 然后重复第一步. 若果仍失败, 必要时重复第二步, 此时就一定能找到被淘汰的页.
改进的Clock算法可减少磁盘的I/O操作次数, 但是系统开销会增加.
页面分配策略
-
何时调入页面
- 预调入策略
将在不久之后便会被访问的页面预先调入内存 - 请求调入策略
当进程所访问的页面不再内存中时, 便立即请求, 由OS将所需页面调入内存.
- 预调入策略
-
从何处调入页面
- 若系统由足够的对换区, 则从对换区调入. 否则从文件区调入.
- UNIX方式: 未运行国的页面从文件区调入, 运行过的页面从对换区调入(运行过的页面已被换出至对换区)
-
缺页率
即, 访问失败页面的次数与总访问数之比.
设S
为访问页面成功的次数,F
为方位失败的次数. 则缺页率为
抖动
抖动现象: 在系统中的进程太多, 需要频繁的进行进程的对换操作, 以至于占用太多时间, 从而处理机的利用率下降并趋于0的情况, 我们称之为抖动. 通常用工作集来避免抖动
工作集是在某段时间内, 进程实际索要访问的页面集合. 我们将这些页面又称为活跃页面.
预防抖动的方法
- 采取局部置换策略
- 工作集算法融入处理机调度
- 调节缺页率
- 暂停进程
请求分段存储管理方式
请求段表
段名 | 段长 | 段基址 | 存取方式 | 访问字段A | 修改位M | 存在位P | 增补位 | 外存始址 |
---|
分为段名, 段长, 段基地址, 存取方式, 访问字段A, 修改位M, 存在位P, 增补位, 外存地址
- 存取方式, 该字段为两位, 可执行(00), 可读(01), 可写(11)
- 访问字段A, 记录该段的访问次数
- 修改位M, 表示该页调入内存后是否已被修改过
- 存在位P, 指示本段是否已调入内存
- 增补位, 特有字段, 表示本段在运行过程中是否做过动态增长.
- 外存始址, 指示本段在外存中的起始地址, 即起始盘块号.
缺段中断机构
地址变换机构
以上是关于操作系统虚拟存储器的主要内容,如果未能解决你的问题,请参考以下文章
sql 这些代码片段将演示如何逐步使用PolyBase。你应该有一个blob存储和存储秘密方便
在Tomcat的安装目录下conf目录下的server.xml文件中增加一个xml代码片段,该代码片段中每个属性的含义与用途
Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段