虚拟内存

  • 覆盖技术和交换技术
覆盖技术: 发生在一个程序运行内部, 程序员将程序分成若干模块, 将不同时运行的模块占据同一块内存, 按照运行的时间先后把当前需要运行的模块加载入内存, 当暂时不需要的模块放入硬盘, 可以减少这个程序的内存大小
交换技术: 以进程为单位, 若当前进程需要更大内存时, 操作系统将暂时不跑的整个进程写入硬盘, 等到需要时再加载回来(当然, 需要由操作系统建立类似于页表的动态的地址映射机制, 让程序以为没有发生这个换入换出的操作): 都是将暂时不需要执行的代码和数据放入硬盘, 必要时再加载回来, 解决程序运行时内存不够用的情况;: 覆盖技术以一个程序内的模块为单位进行覆盖, 因此需要程序员维护这个覆盖关系; 交换技术以整个进程为单位进行换入换出, 由操作系统维护这个交换时机和映射表, OS的开销很大
  • 程序局部性: 具有良好局部性的程序在虚拟内存技术下,可以达到优秀的性能
时间/空间局部性: 程序短时间内所需要的指令和数据尽可能位于一定区域内, 结合cache这样可以尽可能产生更少的缺页中断, 由于虚拟内存技术会产生更少的页的换入换出
  • 虚拟内存技术:结合覆盖技术(同样只把一个程序的一部分放在内存中)和交换技术(同样根据需要作换入换出操作,但不是一整个进程,而是所需的页), 且进行优化
程序最初都在硬盘中, 当装入程序时, 只将目前需要执行的页加载入内存, 程序就可以开始执行;
执行过程中, 若所需指令或数据访问不到(产生缺页分段), 则CPU通知操作系统将相应页加载入内存(若此时内存已满, 操作系统会将内存中暂时不运行的页换出到硬盘中, 从而腾出空间用于将所需页加载入内存) 
  • 页表表项:除了根据逻辑页号查找物理页号这个主要功能之外,四个标志位也有各自作用
    在这里插入图片描述
  • 缺页中断处理过程在这里插入图片描述
  • 页面置换算法:当发生缺页且内存已满时,选择将内存中的哪个页面与硬盘的页面进行置换, 可以尽可能减少产生缺页中断的次数
    在这里插入图片描述
    在这里插入图片描述
局部页面置换算法(针对一个进程)1. 最优页面置换算法OPT:(理想:如果提前预知未来的话是最优算法)将内存中现有的页面按将来还有多久才会被访问到的时间排序,选择时间最长的那个页进行置换, 虽然做不到, 但是可以作为一种比较标准
2. 先进先出算法FIFO(虽然简单, 但可能产生Belady现象): 按进入的先后顺序排成队列, 每次需要置换时, 置换队首即最先进入内存的页面. 
Belady现象: 当增加分配的物理页数, 缺页率反而提高的异常现象; 原因: FIFO不满足栈算法的特点
3. CLOCK页面置换算法(LRU的近似,性能不如LRU,但只使用了1bit,开销更小):利用页表中的访问位作近似判断(0代表最近没被访问过(每隔一段时间os会将内存中页的访问位置0),1代表最近访问过,每当页访问后访问位会被硬件置为1), 将当前内存中的页的页表项构建成一个环形链表,通过一个指针不断扫描该链表(若访问位=0,则找到了; 若访问位=1,则置为0, 用于说明该页老了, 指针后移), 直到找到访问位是0的页进行替换
4. enhanced CLOCK页面置换算法(二次机会法:对CLOCK的改进): 同时利用页表项中的访问位和修改位来指导替换, 允许脏页总是可以抵挡一次时钟扫描(即两次机会), 增大最近被写过的页在内存中存在的时间, 进而减少脏页写回硬盘的次数
原因:如果对内存中的页进行读操作, 当需要置换此页时, 因为该页在内存中和硬盘中是一样的, 因此可以直接free掉, 省去向硬盘写的开销. 如果对内存中的页进行了写操作, 当需要置换此页时, 就必须写回硬盘, 保证日后从硬盘中再换入内存时该页是最新值
![enhanced CLOCK页面置换算法的细节](https://img-blog.csdnimg.cn/20210524220215373.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ppdXJpMTAwNQ==,size_16,color_FFFFFF,t_70)
5. 最久未使用算法LRU(从时间考虑): 将当前内存中最久未被使用的页面进行置换. 根据程序局部性原理,在最近一小段时间内,如果某些页面被频繁访问,那么将来依然很有可能被继续访问;同理,如果有些页面很久没被访问了,那么可以推测将来应该也不会被访问
6. 最不常用算法LFU(从次数考虑): 对内存中的每个页对应一个计数值器, 每当被使用时都++计数值, 当需要置换时选择当前内存中访问次数最少的页进行替换
缺点: 如果一些页面在进程开始时用的很多, 导致计数很大, 因此在很长一段时间内这些页面都会留在内存中,而实际上这些页面之后都不怎么使用了. 解决办法: 把时间因素考虑进来, 每隔一段时间把所有页的计数值<<1, 以此削弱前期次数所占的比例


全局页面置换算法(针对多进程):
1. 工作集模型: 类似滑动窗口, 设置一个窗口大小, 则当前窗口内的所有所需页称为工作集
2. 工作集页置换算法: 随着程序的不断运行, 窗口不断右移, 不断把窗口外的页置换出去, 并把新入窗的页置换进来
3. 缺页率置换算法: 动态变化的窗口大小
  • 抖动问题:
    产生原因: 随着进程数目增加, 分配给每个进程的物理页面随着减少, 若少到一定程度, 不能包含整个工作集, 从而进程会产生很多的缺页中断, 需要频繁在内存和硬盘之间替换页面, 导致进程运行速度很慢 .因此OS需要平衡进程数目和进程所需的页数,以便在并发水平和缺页率之间达到平衡

工作集: 可以理解为进程需要频繁访问的页面个数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值