408 知识点笔记——操作系统(内存管理)

文章目录

3 内存管理

【虚拟存储器】

在程序装入时,可以只将程序的一部分装入内存,而将其余部分留在外存,就可以启动程序执行。采用连续分配方式时,会使相当一部分内存空间都处于暂时或 “ 永久 ” 的空闲状态,造成内存资源的严重浪费,也无法从逻辑上扩大内存容量,因此虚拟内存的实现只能建立在离散分配的内存管理的基础上

虚拟存储器容量既不受外存容量限制,也不受内存容量限制,而是由 CPU 的寻址范围决定

【3种离散分配方式的比较】
在这里插入图片描述

【按需调页】

要使按需调页有效,就要紧紧抓住按需调页被提出的前提,那就是程序运行的局部性原理,包括时间局部性和空间局部性原理

堆栈,只在栈顶进行操作,栈底的元素很久都用不着,显然对数据的访问具有局部性

线性搜索是按照顺序搜索下来的,具有局部性

矢量运算就是数组运算,数组存放是连续的,所以具有局部性

二分搜索是跳着搜索的,不具有局部性,所以不适合按需调页的环境

【存储保护】

存储保护的目的是避免内存中各程序相互干扰,存储保护可以从以下两个方面进行:防止地址越界、防止操作越权

【内存管理方式中代价最小的】

实现分页、分段和段页式存储管理都需要特殊的硬件支持,因而代价较高。分区存储是实现多道程序并发的简单易行而代价最小的方法,这种方法特别适合在嵌入式系统或移动设备的操作系统中实现多道程序并发

【名空间、地址空间、存储空间】

在多道程序环境下,用户不能事先确定程序在内存中的位置,为能独立编制程序只能采用相对地址来编织程序

名空间:名空间是为了解决命名冲突的方法。将名字相同的变量、函数和类定义在不同的名空间中。需要注意的是,同一个名空间的标识符是唯一的

地址空间:一个目标程序所占有的地址范围,这些地址的编号是相对于起始地址而定的,称为相对地址或逻辑地址

存储空间(物理地址空间):目标程序转入主存后占用的一系列物理单元的集合,这些单元的编号称为绝对地址或物理地址

【内部碎片与外部碎片】

内部碎片是指已经分配给作业但不能被利用的内存空间

外部碎片是指系统中还没有分配给作业,但由于碎片太小而无法分配给申请内存空间的新进程的存储块

通俗点理解即是,某个作业所占用的内存区域没有装满,就是内部碎片,而作业与作业之间,如果有内存区域没有分配给某个作业,但又不能分配给任何作业,就是外部碎片

【动态分区分配】

1)分区分配算法

① 首次适应算法

首次适应算法要求空闲分区链以地址递增的次序链接。在分配内存时,从链首开始顺序查找,直到找到一个大小能满足要求的空闲分区为止。然后按照作业的大小,从该分区中划出一块内存空间,分配给请求者,余下的空间分区仍留在空闲链中

优点: 首先利用内存低地址部分的空闲分区,从而保留了高地址部分的大的空闲分区,无内部碎片

缺点: 由于低地址部分不断被划分,致使低地址端留下许多难以利用的很小的空闲分区(外部碎片),而每次查找又都是从从低地址部分开始,这无疑增加了查找可用空闲分区的开销

② 循环首次适应算法

为避免低地址部分留下许多很小的空闲分区,以及减少查找可用空闲分区的开销,循环首次适应算法在为进程分配内存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲分区

为实现该算法,应设置一起始查寻指针,用于指示下一次起始查寻的空闲分区,并采用循环查找方式,即如果最后一个(链尾)空闲分区的大小仍不能满足要求,则应返回到第一个空闲分区,比较其大小是否满足要求

该算法能使内存中的空闲分区分布得更均匀,从而减少了查找空闲分区时的开销,但这样会缺乏大的空闲分区

③ 最佳适应算法

最佳适应算法要求空闲分区按照容量大小递增的次序排列。每次为作业分配内存空间时,总是将能满足空间大小需要的最小的空闲分区分配给作业

优点: 这种方法总能分配给作业最恰当的分区,并保留大的分区

缺点: 导致产生很多难以利用的碎片空间

△☼▽

在这里插入图片描述

分析:最佳适配算法,注意空闲分区是按照容量大小递增的次序排列,尤其在分配 8MB 空间的时候体现出这样的原则

在这里插入图片描述

△☼▽

在这里插入图片描述

分析:C,最佳适应算法总是匹配与当前大小要求最接近的空闲分区,但是大多数情况下空闲分区的大小不可能完全和当前要求的大小相等,几乎每次分配内存都会产生很小的难以利用的内存块,所以最佳适应算法最容易产生最多的内存碎片

④ 最差适应算法

最差使用算法要求空闲分区按照容量大小递减的次序排列。每次为作业分配内存空间时,总是将满足要求且最大的内存空间分配给作业

优点: 这样使分给作业后剩下的空闲分区比较大,产生碎片的可能性最小,对中、小作业来说是有利的。同时,最坏适应分配算法的查找效率最高,根据空闲分区链的排列方式,查找时只要看第一个分区能否满足作业要求即可

缺点: 由于最大的空闲分区总是被首先分配而被划分,当有大作业到来时,其存储空间的申请会得不到满足

2)分区的回收

注意分区合并后的排列问题,首次适应和最佳适应是不一样的

△☼▽

在这里插入图片描述

分析:B,起始地址为 20K 的分区和回收区合并,得分区(起始地址为 20K,分区大小为 40KB )的空闲块,再与起始地址为 200K 的分区合并,得(分区起始地址为 20K、分区大小为380KB )的空闲块,依据最佳适应算法,按照容量大小递增,所以该空闲分区放在链表尾部,首部是分区起始地址为 500K 的分区

【基本分页存储管理方式】

1)分页原理

分页存储管理系统中的逻辑地址包含两部分内容:前一部分为页号 P,后一部分为页内位移 W
在这里插入图片描述
△☼▽

在这里插入图片描述

分析:C,页号占 3 位,页内偏移 10 位,故逻辑地址的有效位是 13 位,32 块物理存储区的大小为 32×1024B = 215B,故物理地址至少为 15 位

△☼▽

在这里插入图片描述

分析:
(1)每页 12KB,故页内偏移占 11 位,逻辑空间 32 页,页号占 5 位,即

在这里插入图片描述
(2)每个进程最多有 32 个页面,于是进程的页表项最多有 32 项;若不考虑访问权限等,则也代表向中需要给出页所对应的物理块号,1MB 物理空间有 1MB/2KB = 29 个物理块,故每个页表项至少有 9 位
(3)如果物理空间减少一半,页表中的页表项数保持不变,每项的长度减少一位

2)页表

△☼▽
在这里插入图片描述

分析:
(1)进程共有 6 页,其中代码占 3 页,数据占 1 页,数据堆占 1 页,用户栈占 1 页,页面依次存放在外存 22、23、25、26 存储块,进程对应的外存是 4 块,显然,有 2 页是在进程运行过程中产生的,一般数据堆和栈是在运行过程中产生的,在虚拟存储管理中,数据堆和栈对应的外存在对换区上,而且只有在换出时才分配,所以在外存地址中一般不包括堆和栈。另外还需要注意的一点是数据页已经进行了修改,所以修改位要置 1

在这里插入图片描述
(2)数据堆还没分配,当用到该页时,因不在内存,故产生缺页中断,考虑 LRU 页面淘汰算法,数据页 3 被引用的时间是 1020,最久未被使用,故这页被选中淘汰,该页框被分配给数据堆页。此时,操作系统根据页表修改位发现该页已经被写了,所以首先要将该页写回外存块中,修改该页表,然后将该页分配给数据堆页,重新修改数据堆页的页表,返回到缺页中断的那条指令,继续执行。修改的页表如下所示

在这里插入图片描述
逻辑页 4、5 从来没有被换出到交换区,就没有外存块号

△☼▽

在这里插入图片描述

分析:让同一个页表的两个页表项指向同一个物理块,用户可以利用此特点共享该页的代码或数据。如果代码是可重入的,这种方法可节省大量的内存空间。实现内存复制操作时,不需要将页面的内存逐字节复制,只要在页表里将指向页面的指针复制到代表目的地址的页表项即可。在这种操作系统中,如果通过一个页表项修改了一个页面的几个字节,那么通过共享该页面的其他页表项表示的地址所访问的值也跟着变化

3)基本地址变换机构

△☼▽

在这里插入图片描述

分析:页号 0 对应的块号为 2,块号 2 的起始地址为 8×1024 = 8192

△☼▽

在这里插入图片描述

分析:B,页号为 3,对应块号 6,且每块的大小为 4KB,故相应的物理地址为 6×4×1024+70 = 24646

△☼▽
在这里插入图片描述

分析:
(1)在此题中,认为起始块为第 0 块

在这里插入图片描述
(2)页面大小 1024B,页内偏移占 10 位,即逻辑地址 2100 (1024×2+52)的页号为 2,页内偏移为 52,页号 2 对应的第 6 块物理块,故物理地址为 6×1024+52 = 6196;同理,逻辑地址 3100(1024×3+28)的页号为 3,页内偏移为 28,其对应的物理地址为 8×1024+28 = 8220

△☼▽

在这里插入图片描述

分析:(1)不述
(2)5499 = 1024×5+379,虚页号 5 对应的物理块号为 0,即物理地址位 379;2221 = 1024×2+173,虚页号 2 对应的物理块号为空,故产生缺页中断,等待将该页调入后再确定物理地址

△☼▽

分析:
一页 32B,占 5 位,第五位为页内偏移,其余位均为页号,于是 (101)8 = 001000001,页号为 2,在联想储存器中对应的页帧号为 f3,故其对应的物理地址为 32×f3+1;(204)8 = 010000100,页号为 4,不在联想存储器中,查找内存页表得页帧号为 f5,故物理地址为 32×f5+4;(576)8 = 101111110,页号为 11,已超出页表范围,产生越界中断

△☼▽

在这里插入图片描述

分析:
每页 1KB,页内偏移占 10 位,用户空间共 32 个页面,页号占 5 位,于是 0A5CH = 000 1010 0101 1100,页号为 2 ,块号为 4,故物理地址为 001 0010 0101 1100 = 125CH;同理,103CH,页号为 4,页号合法,但该页未装入内存,故产生缺页中断;1A5CH,页号为 6,为非法页号,故产生越界中断

【两级页表和多级页表】

1)两级页表

先用外层页号 P 1 P_1 P1 在外部页表上查找,找出的单元内容是二级页表的首地址,页表的首地址家还是那个外层页内地址 P 2 P_2 P2 就是页表项的地址,取出里面的数据(即物理块号),物理块号与页内地址 d d d 相组合就得到了物理地址

在这里插入图片描述
在两级页表机制下,无论是外层页号还是外层页内地址的位数都比一级页表机制少了很多,这样页表的长度就可以减少很多,相应页表的大小也大大减小了

△☼▽

在这里插入图片描述

分析:A,0010 0000 0101 0000 0001,划线部分的 10 位为页目录号

△☼▽

在这里插入图片描述

分析:
1)将内存空间分为若干物理块或页框,页和页框的大小相同,因此,页和页框大小均为 4 K B 4KB 4KB,进程的虚拟地址空间大小为 2 32 / 2 12 = 2 20 2^{32}/2^{12}=2^{20} 232/212=220
2) ( 2 10 × 4 ) / 2 12 ( 页 目 录 所 占 页 数 ) + ( 2 10 × 2 10 × 4 ) / 2 12 ( 页 表 所 占 页 数 ) = 1025 (2^{10}\times4)/2^{12}(页目录所占页数)+(2^{10}\times2^{10}\times4)/2^{12}(页表所占页数)=1025 (210×4)/212()+(210×210×4)/212()=1025
3)需要访问一个二级页表,理由:虚拟地址 0100 0000H 和 0111 2048H 的最高 10 位的值都是 4,访问的是同一个二级页表

△☼▽

在这里插入图片描述

分析:我们直接给出题 44 相关的内容 ,函数 f1 的机器指令代码 64B,push ebp 指令的虚地址为 00401020H
(1)页内偏移占 12 位,一页的大小为 212B(>64B),故 f1 的机器指令代码仅占 1 页
(2)虚拟地址 00401020H 的高 10 位为 00 0000 0001,即取该指令时会访问页目录表的第 2 个表项,中间 10 位为 00 0000 0001,同理会访问页表的第 2 个表项
(3)在执行 scanf() 的过程中,进程 P 因等待输入而从执行态变为阻塞态;输入结束时,P 被中断处理程序唤醒从阻塞态变为就绪态等待调度;最后 P 被调度,变为执行态。CPU 状态会从用户态变为内核态

△☼▽

在这里插入图片描述

分析:每页可存放 1K 个页表项,根据多级页表的理论知识可以知道,采用 n 级页表可寻址的地址空间的容量为 (1K)n×4KB = 210n+12B ≥ 231 B,故 n = 2

用户空间为 2GB,页面大小 4KB,故用户空间有 219 页,一个页面需要 4B 表示其地址,于是需要 (219×4B)/4KB = 29 页表示这些页,页表过于庞大,为了避免把全部页表一直保存在内存中,可采用二级页表管理方式

将整个 2GB 的虚拟地址空间划分为 9 位的一级页表域、10 位的二级页表域和 12 位的页内偏移。每页大小为 4KB,9 位的一级页表域加 10 位的二级页表域共 19 位,可以表示 19 个页面。故页表设计为一级页表只占一页,存放 29 = 512 个二级页表入口地址,二级页表共 512 个,存放 210 = 1024 个虚拟页面地址

△☼▽

在这里插入图片描述

分析:
(1)页内偏移 12 位,故页大小为 4KB,页表项数为 232/212 = 220,又每项占 4B,故一级页表最大为 220×4KB = 4MB
(2)页目录号可表示为 ((( unsigned int ) (LA)) >> 22) & 0x3ff,页表索引可表示为 ((( unsigned int ) (LA)) >> 12) & 0x3ff(& 0x3ff 的作用是只取最后 10 位)
(3)代码页面 1 的逻辑地址是 0000 8000H,取其前 20 位,其页号为 8,表明其位于第 8 个页处,故第 8 个页表项的物理位置为 0020 0000H+8×4 = 0020 0020H,下一个页表项的物理位置为 0020 0024H;代码页面 1 的物理地址为 0090 0000H,以页面为 4KB,故代码页面 2 的起始物理地址为 0090 1000H,于是,进一步知道这两个页表项中的页框号为 00900H 和 00901H
(解释一点:题目中有强调从 0 开始编号时,才注意页号和第几页的对应关系,在没有特别指出时认为页号是几就是第几页)

在这里插入图片描述

2)多级页表

多级页表不仅不会加快地址的变换速度,还因为增加更多的查表过程,会使地址变换速度减慢;也不会减少缺页中断的次数,反而如果访问过程中多级的页表都不再内存中,会大大增加缺页的次数;也并不会减少页表项所占的字节数

而多级页表能够减少页表所占的连续内存空间,即当页表太大时,将页表再分级,可以把每张页表控制在一页之内,减少页表所占的连续内存空间

△☼▽

在这里插入图片描述

分析:D,每页可存放 4KB/4B = 1K 个页表项地址,采用 n 级页表可以寻址的地址空间容量为 (1K)n×4KB = 210n+12B,故 10×6+12 = 72 > 64,需采用 6 级页表

△☼▽

在这里插入图片描述

分析:页面大小为 4KB,页内偏移占 12 位,页表项 4B,每页可有 210 个页表项,最高层页表占用 1 页,即该页表最多存放 210 个页表项,每项指向一页,每页又存放 2^10 ^ 个 页表项,以此类推,⌈(64-12)/10⌉ = 6,故可以采用 6 级页表

△☼▽
在这里插入图片描述

分析:
(1)页面大小为 4KB,故页内偏移占 12 位;又页表项为 8B,每一页可存有 29 项,采用 48 位虚拟地址,虚页号占 36 位,36 = 9×4,故需要采用 4 级页表
(2)平均页面访问时间为 0.98×(10ns+100ns)+0.02×(10ns+100ns+100ns) = 112ns
(3)此时,如果 TLB 未命中的话,此时将会有两次访问页表,故平均页面访问时间为 0.98×110ns+0.02×(10+100+100+100)ns = 114ns
(4)设命中率为 p,则有关系式 p×110ns+(1-p)×310ns = 120ns,解之得 p = 0.95,故此时命中率至少为 95%
(5)(很重要,有利于进一步理解段页管理方式)系统采用虚拟地址 48 位,故其地址空间为 248B,每段最大 4GB,最大段数为 248B/4GB = 216,4GB = 232B,段内地址位数为 32, 多级页表级数为 ⌈(32-12)/9⌉ = 3

【外层页表】

外层页表只是在页表较多时为页表建立的一个页表。因为多了一层页表,也就额外需要一个寄存器来完成地址变换

【基本分段存储管理方式】

1)分段存储原理

2)段表及地址变换过程

在这里插入图片描述

在这里插入图片描述

△☼▽

在这里插入图片描述

分析:D,段号 2 的段长为 300,小于段内地址 400

△☼▽

在这里插入图片描述

分析:
(1)段号为 0,存在位为 0,发生缺段中断
(2)段号为 1,存在位为 1,段内偏移为 20(< 30),其存取控制位为 R,只允许读操作,而指令为写操作,故硬件将产生保护性中断信号
(3)段号为 3,存在位为 1,段内偏移为 20(< 80),其存取控制位为 R,只允许读操作,指令为读操作,故正常执行,将物理地址为 8020 的内容读到寄存器 R1
(4)段号为 3,但此时段内偏移为 100(> 80),产生越界中断
(5)段号为 2,存在位为 1,段内偏移为 100(< 200),故指令正常执行,将跳转到内存单元 3100 处继续执行

3)段的共享与保护

在分段存储管理系统中,分段的共享是通过使多个作业的段表中相应表项指向被共享段的同一物理副本来实现的

在多道程序环境下,必须注意共享段中信息的保护问题。当一个作业正从共享段中读取数据时,必须防止另一个作业修改此共享段中的数据。在当今大多数实现共享的系统中,程序被分为代码区和数据区。不能修改的代码称为纯代码可重入代码这样的代码和不能修改的数据时可以共享的,而可修改的程序和数据则不能共享

与分页管理类似,分段管理的保护主要有两种:地址越界保护访问控制保护

△☼▽
在这里插入图片描述

分析:B,段 S 对于进程 P1、P2 来说,使用位置不同,所以在不同进程中的逻辑段号可能不同;对于 D)选项,为了保证进程可以顺利使用段 S,段 S 必须确保在没有任何进程使用它(可在段表项中设置共享进程计数)后才能被删除,故正确

【基本段页式存储管理方式】

在段页式存储管理系统中,作业的地址空间首先被分为若干个逻辑段,每段都有自己的段号,然后再将每一段分成若干个大小固定的页。对于主存空间的管理仍然和分页管理一样,将其分成若干个和页面大小相同的物理块,对主存的分配以物理块为单位

段页式存储管理系统的逻辑地址结构包含 3 部分内容:段号 S,段内页号 P 和 页内位移D

在这里插入图片描述

为了实现地址转换,段页式存储管理系统中需要同时设立段表和页表。系统为每个进程建立一张段表,而每个分段有一张页表

下面列举从逻辑地址 A 得到物理地址 E 再去访问内存的步骤:

  1. 从逻辑地址 A 中取出前几位为段号 S,中间几位为页号 P,后几位为页内位移 W
  2. 比较段号 S 和段表长度 M,判断是否产生越界中断
  3. 取出段表起始地址 F 与段号 S 相加,用得到的地址值到内存中取出该内存单元存放的数,取出来的数的前几位是页表长度 C,后几位是页表起始地址 d,若 P > C,则产生越界中断
  4. 页表起始地址 d 与页号 P 和页表长度的乘积相加得到页表项在内存中的物理地址,查找到该地址存放的数值与物理块号 b
  5. 用物理块号 b 与页内位移 W 组合成物理地址 E
  6. 用得到的物理地址 E 去访问内存

在这里插入图片描述

通过上面的分析知道,在段页式分配中,CPU 每次从内存中取一次数据需要 3 次访存,页表一次,段表一次,最后取数

△☼▽

在这里插入图片描述

分析:
段号 6 与段表首地址 1000 相加得 1006,1006 在段页中的对应 6000,得页表首地址为 6000,加页号 4 得 6004,页表中 6004 的内容为 14,即块号为 14,故物理地址为 14×1024+237 = 14573

【请求分页存储管理方式】

3)缺页中断与地址变换

若系统发现所要访问的页面不在内存中,便产生一个缺页信号,此时用户程序被中断,控制转到操作系统的缺页中断处理程序段。缺页中断处理程序根据该页在外存的位置将其调入内存。在雕爷的过程中,若内存中有空闲空间,则缺页中断处理程序只需把缺页装入任何一个空闲存储块中,再对页表中的相应项进行修改即可;若内存中无空闲空间,则必须先淘汰内存中的某些页面,若淘汰页曾被修改过,则要将其写回外存

缺页中断与一般中断相比有着明显的区别:

  • 在指令的执行期间产生和处理缺页中断。通常,CPU 是在指令执行完毕后检查是否有中断请求到达,若有便响应。而缺页中断是在一条指令的执行期间发现要访问的指令和数据不在内存时产生和处理,处理完后返回执行当前指令
  • 一条指令可以产生多个缺页中断

△☼▽
在这里插入图片描述

分析:D,缺页处理完成后会到的发生缺页的指令继续执行

△☼▽
在这里插入图片描述

分析:B,处理越界错发生在系统内存在越界错误,显然缺页中断时,不会进行越界出错处理,所以操作系统可能执行的是置换页和分配内存,为什么会有内存分配,可以考虑可变分配置换的工作过程

△☼▽

在这里插入图片描述

分析:
(1)页面大小 4KB,页内偏移占 12 位
2362H = 0010 0011 0110 0010, 页号为 2,在页表中,且有效位为 1,但初始情况下 TLB 为空, 故访问时间为 10ns+100ns+100ns = 210ns
1565H = 0001 0101 0110 0101,页号为 1,发生缺页中断,故访问时间为 10ns+100ns+108ns+10ns+100ns ≈ 108ns
25A5H = 0010 0101 1010 0101,页号为 2,TLB 命中,访问时间为 10ns+100ns = 110ns
(2)在上述访问序列中,访问 1565H 时发生缺页中断,根据 LRU,淘汰 0 号页面,故页面 1 此时对应的页框号为 101H,故 1565H 对应的物理地址为 101565H

△☼▽

在这里插入图片描述

分析:在页表中发现所要访问的页不在内存中,则产生缺页中断。操作系统接到此中断信号后,就调出缺页中断处理程序,根据页表中给出的外存地址,将该页调入内存,使作业继续运行下去。若内存中有空闲块,则分配一页,将新调入页装入内存,并修改页表中相应页表项驻留位及相应的内存块号。若此时内存中没有空闲块,则要淘汰某页。若该页在内存期间被修改过,则要将其回写至外存

结合 72、75 题我们探讨一个问题:为什么 72 题淘汰 0 号页就直接将其页框号分给 1 号页 ?怎么理解 75 题中说缺页发生时根据页表中给出的外存地址将该页调入内存?我们认为页表即是一张计算后得出的关于内存块和物理盘块映射关系的表,已经给出了几号页对应外存哪一盘块,而缺页的发生是页表中的有效位标记为 0,表示当前页未调入内存,所以根据页表给出的映射关系,将外存中的页调入内存,标记有效位为 1

4)请求分页管理方式的优缺点

【分页管理方式能使存储碎片尽可能少】

分页管理与固定分区和可变分区相比,碎片明显减少,因为分页管理的碎片大小能够控制在一个页面大小以内,而页面大小通常都较小。容易混淆的是段页式和页式的碎片数量相比如何?段页式虽然结合了页式和段式的优点,但是碎片的数量却比页式多,因为一个进程往往会有很多段,在段页式管理下每个段都会有一个页内碎片存在,而在页式管理下,一个进程只有一个页内碎片

【页表的存储】

在多个进程并发执行时,所有进程的页表大多数都驻留在内存中,在系统中只设置一个页表寄存器 PTR,在其中存放内存中页表的起始地址和页表长度。平时进程未执行时,页表的起始地址和页表长度存放在本进程的 PCB 中,当调度到某进程时,才将这两个数据装入页表寄存器中。所以,每个进程都拥有一张页表,且进程的页表驻留在内存中

【重定位寄存器】

为使地址变换不影响到指令的执行速度,必须有硬件的支持,即需要在整个系统中增设一个重定位寄存器,用来存放程序(数据)在内存中的起始地址。在执行程序或访问数据时,真正访问的内存地址由相对地址与重定位寄存器中的地址相加而成。因为系统处理器在同一时刻只能执行一条指令或访问数据,所以为每个程序(数据)设置一个寄存器是没有必要的,而且是不现实的,只需在切换程序执行时更新寄存器的内容即可

【可重入程序】

可重入程序主要是通过共享来使用同一块存储空间的,或者通过动态链接的方式将所需的程序段映射到相关的进程中,其最大的优点就是减少了对程序段的调入和调出,因此减少了对换数量

【采用分页或分段管理后,提供给用户的物理地址空间】

页表和段表同样存储在内存中,系统提供给用户的物理地址空间为总的空间大小减去页表或段表的长度。由于页表和段表的长度不能确定,因此提供给用户的物理地址空间大小也不能确定

【页面置换算法】

1)最佳置换算法(OPT)

最佳置换算法是最有的,具有最低的缺页率,但由于实际操作中往往无法事先知道以后会引用到的所有页面的信息,因此最佳置换算法无法实现,只能作为一个标准来衡量其他置换算法的优劣

2)先进先出算法(FIFO)

FIFO 算法可能会产生 Belady 异常(缺页次数随着分配的物理块号的增加而增加)

3)最近最少使用算法(LRU)

最佳置换算法是向后看,而最近最少使用算法则是向前看。该算法可以用寄存器组和栈实现,性能较好。常用的页面置换算法中,LRU 算法最接近最佳置换算法

△☼▽

在这里插入图片描述

分析:C,详细如下

在这里插入图片描述

4)时钟置换算法(CLOCK)

过程: CLOCK 算法给每个页面设置一个访问位,用以标识该页最近有没有被访问过。COLCK 维护一个内存中所有页面的循环链表,当程序需要访问链表中存在的页面时,该页面的访问位就被置为 1;否则,若程序要访问的页面没有在链表中,那就需要淘汰一个内存中的页面,于是指针就从上次被淘汰的页面的下一个位置开始顺序地去遍历这个循环链表,当这个指针指向的页面的访问位为 1 时,就把该访问位清零,指针再向下移动,当指针指向的页面的访问位为 0 时,就选择淘汰掉这一页面,若遍历了一遍链表仍没有找到可以淘汰的页面,就继续遍历下去

CLOCK 算法比 LRU 算法少了很多硬件的支持,实现比较简单,但比 FIFO 算法所需硬件要多

5)改进型时钟算法

它考虑了页面载入内存后是否被修改的问题,增加了修改位(2018年在这里出过一题,问为了支持改进型时钟算法,需要在页表项中设置哪些字段,这里除了修改位还应该包括时钟算法那里引入的访问位)。与简单的 CLOCK 算法相比,该算法可减少磁盘 I/O 次数,但会增加扫描次数

过程:

  1. 从指针当前位置开始,扫描循环链表。在这次扫描过程中,对访问位和修改位不做修改。选择遇到的第一个(访问位=0,修改位=0)的页面用于替换
  2. 如果第一步没有找到,重新扫描,寻找(访问位=0,修改位=1)的页面用于替换,扫描过程中每一个非替换的页面的访问位清零
  3. 如果第二步没有找到,则回到起始位置,此时所有页面的访问位均为 0,重新执行第一、二步,则一定能找到替换页面

淘汰页的次序为 (0,0) → \rightarrow (0,1) → \rightarrow (1,0) → \rightarrow (1,1)

△☼▽

在这里插入图片描述

分析:C,理论如上所述

△☼▽

在这里插入图片描述

分析:C,如果全缺页,则上限是 p,n 个不同页号第一次调入时都发生缺页,故下限是 n

△☼▽

在这里插入图片描述

分析:
NRU:从最近一个时期内未被访问过的页中任选一个淘汰,故淘汰 0 号页(注意强调的是未被访问过,0 号页的 R 和 M 均为 0)
FIFO:淘汰 2 号页面(2 号页面的装入时间为 120)
LRU:淘汰 1 号页面(1 号页面上次引用时间为 260)
第二次机会算法:淘汰第一个自上次对它检查以来都没有被访问过的页,故淘汰 0 号页(0 号页的 R 和 M 均为 0)

这里进一步解释一下为什么 0 号页最近一次被引用,但是 R 和 M 位都是 0,考虑类似于改进型 CLOCK 算法,在没有(访问位=0,修改位=0)的页面可用于替换时,第二趟扫描会将每一个非替换页面的访问位置 0,所以我们可以认为此处 0 号页的情况应该是在置换算法修改后的情况

△☼▽

在这里插入图片描述

分析:
(1)开始时驻留集为空,1 号页对应页框号 32,3 号页对应页框号 15,0 号页对应页框号 21,故访问 <0,4> 时,对应的页框号为 21
(2)访问 <1,11> 时,11 > 10,发生地三轮扫描, 1 号页的页框在第二轮时已经处于空闲页框链中,此刻又被重新访问,所以重新被放回进程的驻留集中,其页框号为 32
(3)访问 <2,14> 时,因为 2 号页从来没有被访问过,故从空闲链表中取出链表头的页框,即其页框号为 41
(4)适合,程序的时间局部性越好,则从空闲页框链中被重新取回的几率越大,该策略的优势就越明显

【二次机会和时钟调度策略】

二次机会和时钟调度策略有个共同之处,就是若当前页面刚被访问过(即引用位为 1),则给予第二次留驻的机会

【抖动现象】

抖动产生的主要原因是页面置换算法不合理。有可能会认为主要原因是内存空间太小,这个在计算机中是固然无法改变的,但是通过一些调度算法可以完全避免 Belady 现象,所以抖动是相对置换不合理来说的

△☼▽

在这里插入图片描述

分析:B,若同时出现 CPU 利用率过低,而磁盘交换区利用率过高,即说明频繁发生缺页,也就是系统发生了抖动,要缓解这种情况,就需要降低系统的缺页率

△☼▽

在这里插入图片描述

分析:C,首先系统要增加进程并发数,即说明系统利用率不够高,可以允许更多的进程并发执行。Ⅰ. 发生抖动,此时应该减少并发进程的数量;Ⅱ. 系统性能正常;Ⅲ. CPU 和 磁盘利用率都很低,表明 CPU 没有得到充分地利用,此时应该增加并发进程数以提高 CPU 利用率

【能够加快虚实地址转换的方法】

增大快表容量能把更多的表项装入快表中,会加快虚实地址转换的平均速率;让页表常驻内存可以省去一些不在内存中的页表从磁盘上调入的过程,也能加快虚实地址的转换

增大交换区对虚实地址转换速度无影响

【页式管理中每个页表项大小的下限如何确定】

在这里插入图片描述

【工作集】

工作集是最近 n n n 次内存访问的页面的集合,数字 n n n 被称为工作集窗口。经常被使用的页面会在工作集中,若一个页面不再被使用,则它会被从工作集中丢弃。当一个进程寻址一个不再工作集内的页面时,会产生一个缺页中断。在处理缺页中断时,更新工作集并在需要时从磁盘中读入此页面

工作集模型的原理:让操作系统监视各个进程的工作集,主要是监视各个工作集的大小。若有空闲的物理块,则可以再调入一个进程到内存以增加多道的程度;若工作集的大小总和增加超过了所有可用物理块的数量总和,则操作系统可以选择一个内存中的进程对换到磁盘中去,以减少内存中的进程数量来防止抖动的发生

△☼▽

在这里插入图片描述

分析:A,最近 6 次访问的页面分别为 6 0 3 2 3 2,在去除重复的页面,形成的工作集为 {6,0,3,2}

【页面分配策略】

在请求分页存储管理系统中,可以采用两种页面分配策略,即固定分配和可变分配。在进行页面置换时,也可以采用两种策略,即全局置换和局部置换,将它们组合起来有如下 3 种策略:固定分配局部置换,可变分配全局置换,可变分配局部置换 (唯独没有固定分配全局置换)

  • 固定可分配局部置换:为每个进程分配一定数目的物理块,这个数据是确定的,进程运行期间不会改变。这样,进程之间不会争夺物理块,会导致有些进程因为物理块太少而频繁地发生缺页中断,有些进程由于分配的物理块太多而浪费内存空间
  • 可变分配全局置换:操作系统维护一个空闲物理块队列,每次有进程缺页时都从空闲物理块队列上取下一个分配给它,如果系统中已经没有空闲的物理块了,那么系统将有可能调出任何进程中的其中一页
  • 可变分配局部置换:为每个进程分配一定量的物理块后,每次发生缺页中断且内存中没有空闲物理块时,只让进程换出自己的某个内存页,但当一个进程频繁地发生缺页中断时,操作系统为它分配额外的物理块,直到缺页率降低到合适程度为止,当一个进程缺页率特别低时,适当减少分配给它的物理块的数量

【在请求分页系统中,为什么说一条指令执行期间可能产生多次缺页中断?】

因为请求调页时,只要作业的部分页在内存中,该作业就能够执行,而在执行过程中发现所访问的指令或数据不再内存时,则产生缺页中断,将所需页面调入内存。在请求调页系统中,一条指令可能跨了两个页面。而其中要访问操作数可能与指令不在同一页面,且操作数本身也可能跨了两个页面。当要执行这类指令,而相应的页都不再内存时,就将产生多次缺页中断

【有效访问时间的计算】

1)基本分页管理方式中有效时间的计算

① 没有快表的情况

假设访存一次所需时间为 t t t,有效访问时间分为:查找页表找到对应页表项,需要访存一次;通过对应页表项中的物理地址访问对应内存单元,需要访存一次。因此, E A T = 2 t EAT = 2t EAT=2t

② 存在快表的情况

假设访问快表的时间为 a a a,快表命中率为 h h h,则有效访问时间分为:查找对应页表项的平均时间 a × h + ( t + a ) ( 1 − h ) a\times h+(t+a)(1-h) a×h+(t+a)(1h);通过页表项中的物理地址访存一次取出所需数据,需要访存一次。因此, E A T = a × h + ( t + a ) ( 1 − h ) + t EAT =a\times h+(t+a)(1-h)+t EAT=a×h+(t+a)(1h)+t

△☼▽

在这里插入图片描述

分析:C,Ⅰ. 没有快表的情况下,有效访问时间为 2×200ns;Ⅱ. 有快表,且快表访问时间忽略不计的情况下,有效访问时间为 0.75×0+0.25×200ns+200ns = 250ns

2)请求分页管理方式中有效时间的计算

与基本分页管理方式相比,请求分页管理中多了缺页中断这种情况,需要耗费额外的时间

  • 访问的页在主存中,且访问的页在快表中,则
    E A T = 查 找 快 表 时 间 + 根 据 物 理 地 址 访 存 时 间 = a + t EAT = 查找快表时间+根据物理地址访存时间=a+t EAT=+访=a+t
  • 访问的页在主存中,但不在快表中,设处理中断缺页的时间为 T T T,则
    E A T = 查 找 快 表 时 间 + 查 找 页 表 时 间 + 处 理 缺 页 时 间 + 查 找 快 表 时 间 + 根 据 物 理 地 址 访 存 时 间 = T + 2 ( a + t ) EAT=查找快表时间+查找页表时间+处理缺页时间+查找快表时间+根据物理地址访存时间 = T+2(a+t) EAT=++++访=T+2(a+t)(千万注意有第二次访问快表)

接下来加入缺页率和快表命中率,假设快表命中率为 h h h,缺页率为 h ′ h' h,则 E A T = a + h × t + ( 1 − h ) × [ t + h ′ ( T + a + t ) + ( 1 − h ′ ) ( a + t ) ] EAT=a+h\times t+(1-h)\times\left [ t+h'(T+a+t)+(1-h')(a+t)\right] EAT=a+h×t+(1h)×[t+h(T+a+t)+(1h)(a+t)]

若题目中没有说明被置换出的页面是否被修改,则缺页中断时间统一为一个值 T T T;若题中说明了被置换的页面分为修改和未修改两种不同的情况,假设被修改的概率为 p p p,处理被修改页面的时间为 T 1 T_1 T1,处理未被修改的页面的时间为 T 2 T_2 T2,则处理缺页的时间为 T = p × T 1 + ( 1 − p ) × T 2 T=p\times T_1+(1-p)\times T_2 T=p×T1+(1p)×T2

△☼▽

在这里插入图片描述

分析:设缺页率为 h,(1-h)×0.1+h[0.3×(8+0.1)+0.7×(20+0.1)] = 200,解之得 h = 0.6×10-5

△☼▽
在这里插入图片描述

分析:设缺页率为 p p p,有关系式 2 u s = ( 1 − p ) × 1 u s + p [ ( 0.3 × 8 u s + 0.7 × 20 u s ) + 1 u s ] 2us= (1-p)\times1us+p[(0.3\times8us+0.7\times20us)+1us] 2us=(1p)×1us+p[(0.3×8us+0.7×20us)+1us]

  • 15
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值