21.内存换出
Posted PacosonSWJTU
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了21.内存换出相关的知识,希望对你有一定的参考价值。
【README】
1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐;
2.有内存换入就有内存换出。
3.因为物理内存空间有限,n次(第n页)换入后导致物理内存用完,则n+1次(第n+1页)换入就会失败;
4.这时需要把某一页换出到磁盘,然后再执行n+1次(第n+1页)换入。
【1】 内存换出
1)并不能总是获得新的页
- 因为物理内存是有限的,多次换入后,物理内存可能满了;
- 这时就需要选择一页淘汰,从物理内存换出到磁盘;
2)选择需要换出的物理内存页的选择算法
- FIFO:先进先出;
- MIN:;
- LRU:最近最少使用;
补充:物理页换出的选择算法代码应该放在 get_free_page() 函数中,换出到磁盘后以腾出空闲页;
【2】内存页换出算法
【2.1】换出算法1-FIFO
1)FIFO,先进先出算法;
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
页 | A | B | C | A | B | D | A | D | B | C | B |
【图解】
- 内存页换入顺序 A, B, C;
- 页D请求调入,因为物理内存满,所以需要选择一页换出;
- 又 页A第1个换入,所以把页A换出;页A换出到磁盘后,再把页D换入到物理内存(原先页A的内存空间);
- 以此类推。FIFO算法共计缺页7次,换页4次。
2)FIFO有个问题:
- 第6次,把A换出,把D换入;
- 第7次,把B换出,把A换入;(这里页A被换出,然后又换入,显然存在资源浪费且影响系统性能);
3)那到底换哪个页是最合适的?
- 换出页C最合适, 从而引出了 MIN 算法;
【2.2】换出算法2-MIN
1)MIN算法:
- 选择最远 将 使用的页淘汰(或选择最近都不使用的页),是最优方案;
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
页 | A | B | C | A | B | D | A | D | B | C | B |
【图解】
- 内存页换入顺序 A, B, C;
- 第6次,页D请求调入,因为物理内存满,所以需要选择1页换出;
- 根据MIN算法(向后)找出最远使用的页(最近不使用的页)为页C,把页C换出到磁盘,再把页D换入到内存页(原先页C的内存页空间);
- 以此类推。MIN算法总计缺页5次,换页2次。
3)MIN算法的缺点
- 需要知道将来发生的事情;没法知道;
- (如第6次使用页D时,MIN算法要预先知道页C在第10次才使用,所以才把页C换出;第10次对于第6次来说就是未来的事情)
【2.3】换出算法3-LRU(最近最少使用)
1)LRU算法: 最近最少使用算法;
- 选择最近最长一段时间没有使用的页淘汰;用过去的历史预测将来;
- 注意 LRU是参考之前的内存页使用情况,而MIN算法是参考之后的,这是它们的区别;
2)LRU算法利用了程序运行的局部性原理:
- 即一段时间内,程序会在一个较小的连续代码段中运行(如while),所访问的存储单元都趋于聚集在一个较小的连续区域中。所以选择最近最少使用的页换出,可以减少换页次数(或减少缺页次数),提高虚拟内存运行效率;
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
页 | A | B | C | A | B | D | A | D | B | C | B |
【图解】
- 内存页换入顺序 A, B, C;
- 第6次,页D请求调入,因为物理内存满,所以需要选择1页换出;
- 根据LRU算法(向前)找出最近最少使用的页为页C,把页C换出到磁盘,再把页D换入到内存页(原先页C的内存页空间);
- 以此类推。LRU算法总计缺页5次,换页2次。
小结:LRU是公认的很好的物理内存页面换出算法。
【3】LRU算法代码的准确实现
【3.1】LRU的准确实现方法1-时间戳
【图解】
- 每页维护一个时间戳;
- 当页被使用时,更新时间戳(如时间戳 1 2 3 4 ...... );
- 当有请求调页且内存满时,换出时间戳最小的页到磁盘,再把页调入物理内存;
【步骤】基于时间戳的LRU算法步骤如下:
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
页 | A | B | C | A | B | D | A | D | B | C | B |
- 第1,2,3次:页A,B,C 先换入到内存,其时间戳分别为 1, 2, 3;
- 第4次:页A被访问(页A的地址空间被指令访问,下同),其时间戳更新为4;
- 第5次:页B被访问,其时间戳更新为5;
- 第6次:页D被访问,缺页请求换出页,根据LRU选择最近最少使用(时间戳最小)的页为C;所以把C换出,D换入,且D时间戳更新为6;
- 第7次:页A被访问,其时间戳更新为7;
- 第8次:页D被访问,其时间戳更新为8;
- 第9次:页B被访问,其时间戳更新为9;
- 第10次:页C被访问,缺页请求换出页,根据LRU选择最近最少使用(时间戳最小)的页为A;所以把A换出,C换入,且C时间戳更新为10;
- 第11次:页B被访问,其时间戳更新为11;
LRU算法实现起来简单,但做到操作系统里面是比较困难的;
原因:
- 每执行一条指令,MM都会做地址重定位(地址翻译),都会更新对应页的时间戳,指令执行效率低;
- 时间戳过大,可能溢出;
综上,操作系统中采用时间戳实现LRU不可行或难度很大;
【3.2】LRU的准确实现方法2-页码栈
1)维护一个页码栈
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
页 | A | B | C | A | B | D | A | D | B | C | B |
【图解】
基于时间戳的LRU算法步骤如下:
- 第1,2,3次:页A,B,C 先换入到内存,分别压栈;
- 第4次:页A被访问,则把栈底元素A拆出来,其他元素往下沉,再把A放入栈顶;(显然,越靠近栈顶,其最近是被使用的;越靠近栈底,表示其最近最少使用)
- 第5次:页B被访问,则把栈底元素 B 拆出来,其他元素往下沉,再把 B 放入栈顶;
- 以此类推。
2)基于页码栈实现的LRU
- 缺点: 每次地址访问都需要修改栈(修改10次左右栈指针),实现代价仍然很大;
综上: 操作系统中LRU 准确实现很少,只能近似实现;
【4】LRU算法的近似实现
【4.1】最近没有使用置换算法(又称二次机会算法或时钟算法)
把时间计数修改为 是或否(1或0);
【图解】
1)当页被访问时,设置该页的引用位为1(引用位用R表示,下同);
2)在换页时(或选择淘汰页时),扫描页的引用位;
- 若R为1,则修改其为0 (可以理解为R等于1则再给一次机会);
- 若R为0,则淘汰该页(或选择该页换出);
【补充1】
- R等于1:表示该页最近被使用;
- R等于0: 表示该页最近没有被使用(与最近最少使用是有区别的,所以它是LRU的近似实现);
【补充2】
- 引用位R可以直接放在页表项中,MMU在查询页表时顺带把定位到的页表项的引用位R设置为1,额外代价非常小;
【补充3】
- 多个内存页的引用位组成循环队列是比较合适的;
【小结】
- 上述算法称为二次机会算法,二次机会算法, SCR (second chance replacement);
- 二次机会算法又称为 Clock Algorithm (时钟算法);
【4.2】Clock算法的分析与改造
1)Clock算法的问题:
- clock算法虽然性能高,但对LRU的近似效果不好;
- 原因在于:如果缺页很少,换页不频繁,则R位会记录太长的历史信息,即所有的R都是1 ;指针转一圈后,所有R都等于0,则把指针指向的第一个页换出。这时clock算法退化为 FIFO 算法。
解决方法:
- 定时清除R位; 新增一个扫描指针来清除 R 位(移动速度快);
- 原先的淘汰页扫描指针还是用来选择换出页,移动速度慢;
综上: clock算法被改造为有2个扫描指针了;一个用来清除R位,另一个用来换出页;
指针 | 描述 |
定时清除R位 | 放在时钟中断处理程序中执行; |
换出页 | 放在缺页中断处理程序中执行; |
【4.3】给进程分配多少个页框
1)页框:指的是物理内存页的个数;
- 一个进程分配的物理内存页个数过多,会造成内存资源浪费,且没有发挥出请求调页机制提高内存利用率的功能;
- 一个进程分配的物理内存页个数过少,可能导致系统颠簸现象。
2)系统颠簸现象:
- 随着进程数增多,cpu利用率先快速上升,到达一定程度后急剧下降的现象。
【图解】
说明1)多道程序程度: 指的是进程个数;
说明2)CPU利用率颠簸现象:随着进程个数增多,cpu利用率提高;但到达一定程度,cpu利用率随着进程个数增多而急剧下降;
说明3)cpu利用率下降原因在于:
- 操作系统内进程过多,给每个进程分配的物理内存页就少了(因为总物理内存大小有限),导致每个进程缺页率增大;
- 缺页率增大到一定程度,进程请求调页频繁或读磁盘频繁,导致cpu阻塞无法执行业务代码最终导致利用率低(补充,每次访问磁盘耗时约1ms);
3)那应该给一个进程分配多少个页框(物理内存页)
- 分配的物理页个数,应该可以覆盖住一个局部连续内存空间(程序运行的局部性原理);
4)那一个进程到底需要多少个物理页呢?
- 一个解决方法是:先分配20个;如果缺页率高,则多分配几个;若缺页率第,则减少几个。
【5】物理内存页换入与换出组合在一起(swap in and swap out)
【图解】
1)内存页换入换出步骤:
- 步骤1:load [addr] 访问addr逻辑地址,MMU把addr逻辑地址翻译为物理地址的过程中,通过逻辑地址计算得到逻辑页号;
- 步骤2:MMU通过逻辑页号从页表查询物理页号(页框号);发现没有记录,即发生了缺页;
- 步骤3:MMU发出缺页中断;
- 步骤4(换入):CPU处理缺页中断,执行缺页中断处理程序,从磁盘读取缺页数据到一个空闲内存页,并建立虚拟内存与物理内存的映射关系(在页表中新增一条映射,或一条页表项);
- 步骤5:重新执行 load [addr] 指令;
- 步骤6(或有,换出):若步骤4中没有空闲内存页,则调用clock算法选出换出的内存页并换出到磁盘;然后重复执行步骤4;
2)swap分区管理 (swap in and swap out ,换入与换出 )
- swap分区管理通过内存,磁盘,时钟中断,缺页中断实现了内存页换入换出;
- 实现内存页换入换出,是为了实现虚拟内存;
- 实现虚拟内存,是为了实现操作系统段页结合的内存管理模式;
- 实现段页,是为了实现程序能够运行起来;
- 程序执行起来,实际上实现的是进程;
【补充】
【补充1】MMU
https://zh.m.wikipedia.org/zh-hans/%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86%E5%8D%95%E5%85%83
内存管理单元(英语:memory management unit,缩写为MMU),有时称作分页内存管理单元(英语:paged memory management unit,缩写为PMMU)。它是一种负责处理中央处理器(CPU)的内存访问请求的计算机硬件。它的功能包括虚拟地址到物理地址的转换(即虚拟内存管理)[1]、内存保护、中央处理器高速缓存的控制,在较为简单的计算机体系结构中,负责总线的仲裁以及存储体切换(bank switching,尤其是在8位的系统上)。
【补充2】虚拟内存
refer2 19.段页结合的实际内存管理_PacosonSWJTU的博客-CSDN博客
虚拟内存定义:
- 操作系统用程序实现了虚拟内存,把段与页结合起来;如下图所示。
以上是关于21.内存换出的主要内容,如果未能解决你的问题,请参考以下文章