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博客

虚拟内存定义:

  • 操作系统用程序实现了虚拟内存,把段与页结合起来;如下图所示。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值