存储器管理(四)

目录

一、页面置换算法★

1.最佳置换算法和先进先出置换算法

(1)最佳置换算法

 (2)先进先出置换算法

2.最近最久未使用(LRU)算法★

①寄存器

②栈

3.Clock置换算法

(1)简单的Clock置换算法

(2)改进的Clock是置换算法(又称改进的NRU)

4.其它置换算法★

 二、请求分段存储管理方式

1.请求分段中的硬件支持

(1)段表机制

2.分段的共享和保护

(1)共享段表

 (2)共享段的分配与回收

①共享段的分配

②共享段的回收


一、页面置换算法★

在进程运行过程中,若其访问的页面不在内存而需将其调入,但内存已无空闲空间时,需从内存中调出一页程序或数据,送入磁盘的对换区。但应将哪个页面调出,需根据一定的算法来确定。把选择换出页面的算法称为页面置换算法,其好坏直接影响系统的性能。

一个好的置换算法应具有较低的页面更换频率。从理论上讲,应将那些以后不会再访问的页面换出,或者把那些在较长时间内不会再访问的页面换出

设作业执行中访问页面的总次数为A,其中由F次访问的页面尚未装入主存,故产生了F次缺页中断

现定义缺页中断率为:f=F/A

1.最佳置换算法和先进先出置换算法

最佳置换算法是一种理想化的算法,具有最好的性能,但难于实现。先进先出置换算法最直观、最简单,但可能性能最差,故应用极少

(1)最佳置换算法

其所选择的被淘汰页面,将是以后永不再用的,或许是在最长(未来)时间内不再被访问的页面。

优点:保证获得最低的缺页率

缺点:无法预知一个进程在内存的若干页面,哪个在未来最长时间内不再被访问

算法无法实现,但可用于评价其他算法

5ffa01684bf94a0093e724cfee510782.png

 第一次缺页:7是未来最长时间内不被访问的页面,调入2,换出7

 第二次缺页:1是未来最长时间内不被访问的页面,调入3,换出1

 第三次缺页:0是未来最长时间内不被访问的页面,调入4,换出0

 第四次缺页:4是未来最长时间内不被访问的页面,换入0,换出4

 第五次缺页:3是未来最长时间内不被访问的页面,换入1,换出3

 第六次缺页:2是未来最长时间内不被访问的页面,换入7,换出2

 (2)先进先出置换算法

算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰

算法实现简单,只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针(替换指针),使它总是指向最老的页面

算法与进程的实际运行规律不相适应,因为进程中的某些页面经常被访问,但先进先出置换算法不能保证这些页面不被淘汰

38545669e1b04b07848eea1d97cb0ce1.png

 

 第一次缺页:7是最先被访问的,调入2,换出7

 第二次缺页:0是最先被访问的,调入3,换出0

 第三次缺页:1是最先被访问的,调入0,换出1

 第四次缺页:2是最先被访问的,调入4,换出2

 第五次缺页:3是最先被访问的,换入2,换出3

 第六次缺页:0是最先被访问的,换入3,换出0

第七次缺页:4是最先被访问的,换入0,换出4

 第八次缺页:2是最先被访问的,换入1,换出2

 第九次缺页:3是最先被访问的,换入2,换出3

 第十次缺页:0是最先被访问的,调入7,换出0

 第十一次缺页:1是最先被访问的,换入0,换出1

 第十二次缺页:2是最先被访问的,换入1,换出2

 Belady现象:如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象。发生在FIFO(先进先出)置换算法

可以尝试4个物理块的情况

2.最近最久未使用(LRU)算法★

(1)LRU置换算法的描述

算法根据页面调入内存后的使用情况进行决策。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。

该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问依赖所经历的时间t,当需淘汰一个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面予以淘汰

b0fbc403561b47cd8cd0ade522e03d48.png

 第一次缺页:7是最久未使用的,调入2,换出7

 第二次缺页:1是最久未使用的,调入3,换出1

 第三次缺页:2是最久未使用的,调入4,换出2

 第四次缺页:3是最久未使用的,换入2,换出3

 第五次缺页:0是最久未使用的,换入3,换出0

 第六次缺页:4是最久未使用的,换入0,换出4

第七次缺页:0是最久未使用的,换入1,换出0

 第八次缺页:3是最久未使用的,换入0,换出3

 第九次缺页:2是最久未使用的,换入7,换出2

 (2)LRU置换算法的硬件支持(实现)

LRU置换算法虽然较好,但需较多的硬件支持,为了了解一个进程在内存中的各个页面各有多少时间未被进程访问,以及如何快速地知道哪一页是最近最久未使用的页面,需有以下两类硬件之一的支持:

  • 寄存器

①寄存器

为每个在内存中的页面配置一个移位寄存器,用来记录某进程在内存中各页的使用情况。移位寄存器表示为eq?R%3DR_%7Bn-1%7DR_%7Bn-2%7DR_%7Bn-3%7D...R_%7B2%7DR_%7B1%7DR_%7B0%7D

当进程访问某物理块时,要将相应寄存器的eq?R_%7Bn-1%7D位置成1。此时,定时信号将每隔一定时间将寄存器右移一位。如果把n位寄存器的数看作一个整数,那么具有最小数值的寄存器所对应的页面,就是最近最久未使用的页面。【因为越久不被访问,寄存器高位值为0的越多】

f4b5f0496d174d54ba58952b435c25b8.png

当前时刻Rn-1位即R7位,页面2、5被访问,所以值为1,下一时刻,将寄存器右移一位,如下图所示

3635f62ba2454b09b666923222210db1.png

②栈

利用一个特殊的栈来保存当前使用的各个页面的页面号。每当进程访问某页面时,便将该页面的页面号从栈中移出,将它压入栈顶。因此,栈顶始终是最新被访问页面的编号,而栈底则是最近最久未使用页面的页面号

bf92572f676c4f97800b8d24ce6d0a12.png

3.Clock置换算法

(1)简单的Clock置换算法

最佳置换算法性能最好,但无法实现;先进先出置换算法实现简单,但算法性能差;最近最久未使用置换算法性能好,是最接近OPT算法性能的,但是实现起来需要专门的硬件支持,算法开销大。

简单的Clock置换算法 又称最近未使用算法(NRU),是LRU和FIFO的折衷

原理:NRU算法是根据访问位来确定谁是最近一个时期内未被访问的页,循环扫描,若遇到的访问位为0,则选中置换,若遇到的访问位为1,则将其改为0,让其继续驻留内存,继续循环扫描下一个

为每个页面设置一个标志位(use bit,若该页被访问则置user bit=1),再将内存中的页面都通过链接指针链接成一个循环队列。置换时采用一个指针,从当前指针位置开始按地址先后检查各页,寻找use bit=0的页面作为被置换页。指针经过的user bit的页都修改user bit=0,若检查到队列的最后一个页面时,访问位仍为1,则再返回到队首去检查第一个页面

89a9a494989c48069a1745a4d5dfadb6.png

(2)改进的Clock是置换算法(又称改进的NRU)

除了考虑一个页面最近有没有被访问过之外,操作系统还应考虑页面有没有被修改过。在其他条件都相同时,应优先淘汰没有修改过的页面,避免I/O操作

修改位=0,表示页面没有被修改过;修改位=1,表示页面被修改过。

原理:改进型NRU算法是通过多轮扫描访问位和修改位来一起确定谁是淘汰的页。

第一次扫描寻找A=0,M=0的页(不修改标志位);

若失败进行第二次扫描,寻找A=0,M=1的页,同时把遇到的A为1的都改为0【没有(0,0)的页,尝试将所有页的访问位改为0,或者说放宽条件,将未访问但修改的换出】;

若仍失败,进行第三次扫描,此时重复第一次扫描的任务,寻找A=0,M=0的页面;

若仍失败,则重复第二步扫描,此时一定能找到淘汰页

最后会进行4轮扫描

4.其它置换算法★

如最少使用置换算法LFU(Least Frequently Used)

选择到当前时间为止被访问次数最少的页面被置换;

  • 基本方法:记录每个页面的访问次数,最少访问的页面首先考虑淘汰
  • 实际采取方法:为页面设置移位寄存器

与LRU的区别:R1=10000000、R2=01110100,如果是LRU淘汰R2(因为R2最小),如果是LFU淘汰R1(最近只被访问1次)

【题目1】

430d99147f074df18a2bcd56b5863103.png

(4)(2)(6)(2)

【题目2】

6f33d374ee714b6eaef4fa32b842696d.png

(1)FIFO:页号2;LRU:页号1;NRU:页号0;改进型的NRU:页号2

【题目3】如果每分钟进行一次调页,主存块为 3 。若所需页面走向为 2, 1, 2, 1, 2, 3, 4 。当调页面 4 时发生中断,若按 LRU 算法和 LFU 算法分别应该换出那个页面?

(1)LRU 关键是看页面最后一次被使用到发生调用的时间长短!
(2)LFU 关键是看一定时间段内页面被使用的频率

按LRU算法换出1号页面 (1页面最久未被使用);按LFU算法换出3号页面(页面3只使用了一次)

【题目4】

f878023f155241edac566c74f072fecf.png

(1)FIFO算法选择最先装入内存的页面进行换出:3号页;(2) LRU算法选择最近最长时间没被使用的页面进行换出:2号页;(3)改进的Clock算法优先选择访问位和修改位均为0的页面进行换出:0号页

【题目5】在一个请求分页系统中,假如一个作业的页面走向为4, 3, 2, 1, 4, 3, 5, 4, 3, 2, 1, 5 ,目前它还没有任何页装入内存,当分配给该作业的物理块数目 M 分别为 3 和 4 时,请分别计算采用
LRU 和 FIFO 页面置换算法时,访问过程中所发生的缺页次数和缺页率,并比较所得的结果。

 当M=3

0ce5a6d6979f432d8c6586ee0d9207eb.png

FIFO:共发生 9次缺页中断 缺页率=9/12=75%
LRU:共发生 10次缺页中断 缺页率=10/12=83.3%

当M=4

3a614dc8040540a68b0c0ce08fedaff0.png

FIFO:缺页率=10/12=83.3%
LRU:缺页率=8/12=66.7%
上述结果可以看出,对先进先出算法而言,增加分配给作业的内存块数反而出现缺页次数增加的异常现象。 

【题目6】某页式虚拟存储管理系统中,页面大小为 1K 字节,一进程分配到的内存块数为 3 ,并按下列地址顺序引用内存单元: 3635, 3632 , 1140 , 3584 , 2892 , 3640 , 0040 , 2148 , 1700 ,2145 , 3209 , 0000 , 1102 , 1100 。如果上述数字均为十进制数,而内存中尚未装入任何页,请:

(1) 给出使用 LRU 算法时的缺页次数,并与使用 FIFO 算法时的情况进行比较;
(2) 用流程图的方式解释地址变换的过程 ( 中断处理流程细节可略 )。

解:(1)内存单元: 3635, 3632 , 1140 , 3584 , 2892 , 3640 , 0040 , 2148 , 1700 ,2145 , 3209 , 0000 , 1102 , 1100,对应的块分别是3、3、1、3、2、3、0、2、1、2、3、0、1、1。

因此,可以计算出,采用LRU算法时,缺页次数为8;采用FIFO算法时,缺页次数为6。

LRU算法用最近的过去作为预测最近的将来的依据,因为程序执行的局部性规律,一般有较好的性能,但实现时,要记录最近在内存的每个页面的使用情况,比FIFO算法困难,其开销也大。有时,因页面的过去和未来的走向之间并无必然的联系,如上面,LRU算法的性能就没想象中那么好。

(2)地址变换流程如下所示

70cb7735de8b43949a5313e9225f3e24.png

 二、请求分段存储管理方式

在请求分段系统中,程序运行之前,只需先调入若干个分段(不必调入所有的分段),便可启动运行。当所访问的段不在内存中时,可请求os将所缺的段调入内存

1.请求分段中的硬件支持

(1)段表机制

在请求分段系统中所需要的主要数据结构是段表。由于在应用程序的许多段中,只有部分段装入内存,其余的一些段仍留在外存上,故需在段表中增加若干项,以供程序在调进、调出时参考

请求分段系统中的段表项:

4281930c6f994228a34ad833695c1fd3.png

 ①存取方式:用于标识本分段的存取属性

②访问字段A:用于记录本段被访问的频繁程度

③修改位M:表示该段在调入内存后是否被修改过

④存在位P:指示该段是否已调入内存

⑤增补位:用于表示该段在运行中是否做过动态增长

⑥外存地址:用于指出该段在外存上的起始地址(盘块号)

(2)缺段中断机构

在请求分段系统中,每当发现运行进程所要访问的段尚未调入内存时,便由缺段中断机构产生一缺段中断信号,进入OS后由缺段中断处理程序将所需的段调入内存

缺段中断同样需要在一条指令的执行期间,产生和处理中断,以及在一条指令执行期间,可能产生多次缺段中断。但不会出现一条指令被分割在两个分段中或一组信息被分割在两个分段中的情况

(3)地址变换机构

请求分段系统中的地址变换机构,是在分段系统地址变换机构的基础上形成的。因为被访问的段并非全在内存,因而在地址变换时,若发现要访问的段不在内存,必须先将所缺的段调入内存,并修改段表,然后才能利用段表进行地址变换。在地址变换机构中需增加缺段中断的处理及请求等功能

416437a0dd6540ebadd11425197373dd.png

2.分段的共享和保护

(1)共享段表

为了实现共享,可在内存中配置一张共享段表,所有各共享段都在共享段表中占有一表项。

a732e4bbc8e04529b4ed5cc4906aaab4.png

①共享计数count:共享段为多个进程所需要,当某进程不再需要它而释放它时,系统并不回收该段所占内存区,仅当所有共享该段的进程全都不再需要它时,才由系统回收该段所占内存区。设置count用于记录有多少个进程需要共享该分段。

②存取控制字段:对于一个共享段,应给不同的进程不同的存取权限

③段号:对于一个共享段,不同的进程可以各用不同的段号去共享该段。

 (2)共享段的分配与回收

①共享段的分配

为共享段分配内存时,对第一个请求使用该共享段的进程,由系统为该共享段分配一物理区,再把共享段调入该区,同时将该区的始址填入请求进程的段表的相应项中,还须在共享段表中增加一表项,填写有关数据,把count置为1;之后,当又有其他进程需要调用该共享段时,无需再为该段分配内存,只需在调用进程的段表中,增加一表项,填写该共享段的物理地址;在共享段的段表中,填上调用进程的进程名、存取控制等,再执行count:=count+1操作。

②共享段的回收

当共享该段的进程不再需要该段时,应将该段释放,包括撤消在该进程段表中共享段所对应的表项,以及执行count:=count-1操作。如果结果为0,则需由系统回收该共享段的物理内存,以及取
消在共享段表中该段所对应的表项,否则只取消调用者进程在共享段表中的有关记录。

【问题】假如一个程序的段表如下表所示,其中存在位为 1 表示段在内存,存取控制字段中 W 表示可写, R 表示可读, E 表示可执行。对下面的指令,在执行时会产生什么样的结果?
(1)STORE R1,[0,70]         (2)STORE R1,[1,20]
(3)LOAD R1,[3,20]         (4)LOAD R1,[3,100]         (5)JMP [2,100] 

77c21caa37564acd996b9580b5eb2fba.png

答:(1)指令 STORE RI,[0,70]。从段表的第0项可读出第0段的存在位为0,表示相应
段未装入内存,因此地址变换机构将产生一缺段中断,以请求OS将其调入内存。

(2)指令STORERI,「1,20]。从段表的第1项可以看出,本指令对内存的访问方式(写)与保护码字段(只读)不符,故硬件将产生保护性
中断信号。

(3)LOAD R1,[3,20]。从段表的第3项可读出第3段的存在位为1,内存始址为8000,段
长为 80,存取控制为R,因此,逻辑地址合法,访问方式也合法,形成物理地址8020后,
指令将把该单元的内容读到寄存器 R1中。

(4)指令LOAD RI,[3,100]。从段表的的第3项可读出第3段的存在位为1,内存始址为
8000,段长为80,存取控制为R,因此,指令的逻辑地址中段内地址超过了段长,地址变
换机构将产生越界中断信号。

(5)指令JMP[2,100]。从段表的第2项可读出第2段的存在位为1,内存始址为 3000,段
长为200,访问权限为E,因此逻辑地址与访问方式都合法,形成物理地址3100,指令执行
后,将跳转到内存单元 3100处继续执行。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值