虚拟存储器管理
概述
局部性原理
🌛程序在执行过程中呈现局部性原理
❓什么是局部性原理
局部性原理分为时间和空间两方面
- 时间局部性 :一条指令被执行后,那么它可能很快会再次执行
- 空间局部性 :某一个存储单元被访问后,那么与此存储单元相邻的单元很可能被访问
虚拟存储器定义
虚拟存储器:
- 把程序的一部分装入内存便可运行程序的存储系统
- 具有请求调入功能和置换功能
- 从逻辑上对内存实现扩充
影响虚拟存储器大小的两个因素
- 外存大小 2. 指令中的地址长度
虚拟存储管理
分页虚拟存储管理
基本原理
分页虚拟存储管理方式是在分页系统的基础上增加了请求调页功能和页面置换功能
分页虚拟存储管理的页表是在原来的基础上发展而来的包括
- 物理块号 :调入内存时的块号
- 状态位 : 表示改页是否已经调入内存
- 访问位 :表示该页在内存期间是否被访问过
- 修改位 : 表示该页在内存期间是否被修改过,若未修改过则置换该页时就不需要将该页写回外存,否则需要写会外存保证外存中保留的是最新
- 外存地址 : 该页在外存上的地址,通常是物理块号
缺页中断机构
在分页虚拟存储管理系统中,每当要访问的页面不在内存时,便产生一个缺页中断,请求操作系统把所缺页面调入内存
⛵️缺页中断与一般中断的区别
- 缺页中断在指令执行期间产生和处理中断信号。 通常都是在一条指令执行完毕后去检查是否有中断产生,若有则去响应中断;否则继续执行下一条指令;然而缺页中断是在指令执行期间,发现所要访问的指令或数据不在内存时产生和处理的。
- 一条指令在执行期间可能产生多次缺页中断
地址变换机制
分页虚拟存储管理系统中的地址变换机构,在原来的基础上增加了产生和处理缺页中断以及从内存中换出一页等功能
具体过程:
当用户进程要求访问某一页时,如果该页已经调入内存,那么按照分页存储管理方式中的地址变换过程转换地址;如果改页没有调入到内存中,则产生一缺页中断,系统进入相应的缺页中断处理过程。
中断处理过程: 首先保存当前进程的CPU环境,从外存中找到该页。然后,查看当前内存是否有空闲内存调入该页,如果有则启动I/O将该页从外存调入内存,同时修改页表,再按分页存储管理方式的地址变换转换地址;如果内存已满,则按照某种算法选择一页作为淘汰页面调出,腾出空间后再调入。
如果被淘汰的页在内存中已经被修改过,则需将改页写回外存。
页面置换算法
页面置换算法:选择需要被淘汰的页面
- 最佳置换算法(OPT)
选择的淘汰页面将是以后永不使用或者是在最长时间内不再访问的页
最佳置换算法能保证获得最低的缺页率,但无法预知一个进程在内存的若干个页面中哪一个页面是未来最长时间不再被访问的,因此这种算法是无法实现的,只能作为其他置换算法的衡量标准
-
先进先出算法(FIFO)
每次淘汰最先进入内存的页
简单,易于实现
-
最近最久未使用算法(LRU)
淘汰最近一段时间内最少使用的一页
-
简单Clock算法(最近未使用算法)
为每页设置一个访问位,再将内存中所有的页面通过连接指针链成一个循环队列,当某页被访问时,访问位置1
置换算法在选择一页淘汰时只须检查其访问位,如果是0,则选择将该页换出,若为1则重新将它复0,暂不换出
-
改进型Clock算法
再将一个页面换出时,如果该页面已经被修改过,需将它重新写到磁盘上。修改过得页面换出时比为修改过得页面开销要大
所以增加访问位A和修改位M
可以划分四种类型的页面
- A=0 , M=0 -----> 该页即没有被修改也没有被访问为最佳淘汰页
- A=0 , M=1 -----> 该页最近未被访问,但已被修改
- A=1 , M=0 -----> 已被访问,但未被修改
- A=1 , M=1 -----> 已被访问且被修改
执行过程
(1) 从指针所指示的当前位置开始,扫描循环队列,寻找A=0,M=0的页面将所遇到的第一个页面作为所选中的淘汰页。第一次扫描期间不改变访问位A
(2) 如果第一步失败,则开始第二轮扫描寻找A=0,M=1的第二类页面,将所遇到的第一个这类页面作为淘汰页,在第二轮扫描期间,将所有经过的页面的访问位置置0
(3) 如果第二步也失败,则将指针返回最开始的位置,然后重复第一步,如果仍失败,必要时在重复第二步,此时一定能找到被淘汰的页
内存分配策略和分配算法
-
最少物理块数
保证进程运行所需的最少物理块数
-
内存分配策略
分配策略: 固定分配 可变分配
置换策略: 全局置换 局部置换
三种内存分配策略
- 固定分配局部置换
- 可变分配全局置换
- 可变分配局部置换
-
物理块分配算法
- 平均分配算法
- 按比例分配算法
- 考虑优先级的分配算法
调页策略
-
请求调页策略
访问某一页面而该页面不在内存时由操作系统将其调入内存
-
预调页策略
在缺页中断发生之前进行调度,即当一个页面即将被访问之前将其调入内存
抖动
产生抖动的原因
每个进程的大部分时间都用于页面的换进换出,而几乎不能去做任何有效的工作,从而导致发生处理机利用率急剧下降,而趋于零的现象,称此时系统处于抖动状态
预防抖动的方法
- 采用局部置换策略
- 利用工作集算法防止抖动
- 利用"L = S"准则调节缺页率。L是缺页之间的平均时间,S是平均缺页服务的时间
- 挂起某些进程
分段虚拟存储管理
基本原理
与分页虚拟存储管理原理相同
段表包括:
- 段名
- 段长
- 段的基址
- 存取方式 : 存取属性 可执行 可读 还是允许读/写
- 访问位
- 修改位
- 存在位 : 是否已被调入内存
- 增补位 :本段在运行过程中是否做过动态增长
- 外存地址
缺段中断机构
与缺页中断相同
区别在于段是信息的逻辑单位,不会存在一条指令位于两个段的情况
段的动态连接
将段的连接推迟到程序运行过程中执行,需要哪一段才把哪段连接到程序地址空间中。
段的共享
利用段的动态连接可以更好的实现段的共享,一个共享段在不同程序中可以具有不同的段号
可重入代码
又称纯代码,是一种允许多个进程同时访问的代码