前言
- 本文基础知识部分来自于b站:分享笔记的好人儿的思维导图与王道考研课程,感谢大佬的开源精神,习题来自老师划的重点以及考研真题。
- 此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析,本人技术有限,最终数据清洗结果不够理想,相关CSDN文章便没有发出。
请注意,本文中的部分内容来自网络搜集和个人实践,如有任何错误,请随时向我们提出批评和指正。本文仅供学习和交流使用,不涉及任何商业目的。如果因本文内容引发版权或侵权问题,请通过私信告知我们,我们将立即予以删除。
文章目录
- 前言
- [第三章 内存管理](#第三章 内存管理)
- 内存管理的基本原理和要求
- 分页与分段存储管理方式
-
- 概念串联(哈工大)
- 分段
- 请求分页管理方式
- 页面置换算法及页面分配策略
- [408 - 2023](#408 - 2023)
-
- [28. 关于进程虚拟地址空间的叙述](#28. 关于进程虚拟地址空间的叙述)
- [30. 进程共享数据的页号和页框号](#30. 进程共享数据的页号和页框号)
- 408-2022
-
- [29. 缺页异常处理过程中的操作](#29. 缺页异常处理过程中的操作)
- [30. 不会影响系统缺页率的选项](#30. 不会影响系统缺页率的选项)
- 408-2021
-
- [28. 改进型Clock置换算法的地址变换](#28. 改进型Clock置换算法的地址变换)
- [29. 二级页表中的CPU页表基址寄存器内容](#29. 二级页表中的CPU页表基址寄存器内容)
- [32. 通过系统调用完成的操作](#32. 通过系统调用完成的操作)
- 408-2020(未完待续,逐张试卷分析中)
第三章 内存管理
什么是内存?有何作用?(王道)
补充知识:几个常用的数量单位
知识滚雪球:指令的工作原理
内存管理的基本原理和要求
程序进入内存
最初的故事(哈工大)
-
创建进程时,首先在内存中找一块空闲的内存
-
将空闲地址(基地址)找到并赋值给PCB
-
程序载入到空闲内存后,PC置好初始地址然后执行,每次执行指令都要进行地址翻译
-
上下文切换时,PCB中的基址就进入基址寄存器
编译连接装入
-
从写程序到程序运行
-
链接(概念见图片)
-
静态链接
- 程序运行前,将各模块及库函数链接成一个完整的可执行程序
-
装入时动态链接
- 将用户源程序编译后得到的目标模块,装入内存时,采用边装入边链接的方式
-
运行时动态链接
- 对于某些目标模块的链接,程序执行中需要才会对其链接
- 对于某些目标模块的链接,程序执行中需要才会对其链接
-
-
装入(概念见图片)
-
绝对装入
- 装入时按实际内存地址,将程序和数据装入内存
- 装入时按实际内存地址,将程序和数据装入内存
-
可重定位装入(静态重定位)
- 装入时对目标程序中指令和数据修改地址为物理地址,放入内存(作业必须一次性全部装入,运行时不能移动,不能申请内存空间)
- 装入时对目标程序中指令和数据修改地址为物理地址,放入内存(作业必须一次性全部装入,运行时不能移动,不能申请内存空间)
-
动态运行时装入(动态重定位)
- 装入内存后不立即把地址转换,只有当程序执行时才进行地址翻译(运行时重定位,基址(重定位)寄存器)
- 装入内存后不立即把地址转换,只有当程序执行时才进行地址翻译(运行时重定位,基址(重定位)寄存器)
-
-
重定位(哈工大):修改程序中相对地址(逻辑地址)为绝对地址(物理地址)
-
时机(对应装入三种)
-
编译时(只能放固定地址,逻辑地址=物理地址)
-
载入(装入)时(载入时修改地址,慢但灵活)
- 程序载入后需要移动,引入运行时重定位
-
运行时重定位:执行每条指令都要从逻辑地址算出物理地址(地址翻译),逻辑地址+基地址(从PCB中取)= 物理地址
-
-
内存的基础知识知识回顾
逻辑(虚拟)地址空间和物理地址空间
-
物理地址空间
- 内存中物理单元的集合,进程在运行时执行指令和访问数据,都要通过物理地址从主存中存取
-
逻辑(虚拟)地址空间
-
即相对地址,链接程序依次按照各个模块的相对地址构成统一的从0单元开始编址的逻辑地址空间
-
实现分段与分页的关键所在,为了实现段页式引入,下文详述
-
内存管理的概念
内存空间的分配与回收
连续分配管理方式
单一连续分配
固定分区分配
动态分区分配
动态分区分配算法
连续分配管理总结
内存空间的扩展
覆盖技术
交换技术
覆盖与交换总结
地址转换
内存保护
-
方案一:CPU设置上下限寄存器,存放用户作业在主存中的上限和下限,每当CPU访问地址,和寄存器比较,是否越界
-
方案二:内存管理机构动态将逻辑地址与界地址寄存器进行比较,若未越界,则加上重定位寄存器的值映射为物理地址(逻辑地址+基地址=物理地址)
内存管理的概念知识回顾
分页与分段存储管理方式
概念串联(哈工大)
- 操作系统为了让用户方便使用,我们需要分段,仅仅分段会导致内存利用率低(外部碎片),引出分页,然后分段+分页,两个结合的核心是虚拟内存,如果要有虚拟内存,就必须要有换入与换出机制
分段
-
程序员眼中程序由若干段组成,每个段有各自特点:代码段只读、代码/数据段不会动态增长(段内连续,段间不要求连续)
-
有段表程序进入内存的故事
-
程序分成多个段,每个段在内存中找到空闲的地方
-
每个空闲内存的基址放在LDT表(局部描述符表,段表)中,最后将该LDT表赋给PCB
-
每次执行指令时都查LDT表,将逻辑地址转变为物理地址
-
-
地址变换机构
-
-
地址结构:段号S+段内偏移量W
-
段表
-
每个进程都有一张映射逻辑地址空间和物理地址空间的段表,每个段表项对应进程的一段
-
段号(隐含)+段长+本段在主存中的始址
-
-
-
-
段的共享与保护
-
共享
- 两个作业的段表中相应表项指向被共享段的同一物理副本实现
-
保护
- 存取控制保护+地址越界保护
-
内存分区(连续)
-
单一连续分配(内存仅有一道程序)
-
系统分为系统区和用户区,系统区仅供操作系统使用,通常在低地址部分,用户区为用户提供,内存中只存在一道程序
补充:不能被修改的代码为纯代码(可重入代码/非临界资源) -
只适用于单用户单任务操作系统,存在内部碎片
-
-
固定分区分配
-
将用户空间划分为若干固定大小的区域,每个分区仅装入一道程序(适合多道程序存储,无外部碎片)
-
分区大小相等
-
分区大小不等
- 通常将分区按大小排队,建立分区说明表(分区始址、大小、状态)
-
-
-
动态分区分配
-
进程装入内存时,根据进程大小动态建立分区
-
存在外部碎片
- 内存紧缩:空闲分区合并(需要移动)
-
实现
- 空闲分区表/空闲分区链(双向链表)
-
首次适应算法
-
空闲分区按照地址递增的次序进行查找,第一个满足条件的进行分配
-
性能最好,开销小,回收分区后一般无需重新排序
-
-
最佳适应算法
-
按容量递增的顺序进行查询分区,将第一个满足条件的进行分配
-
尽可能留下大片空闲区,外部碎片最多,回收分区后可能需要重新排序
-
-
最坏适应算法(最大适应算法)
-
空闲分区按照容量递减的次序进行查找,第一个满足条件的进行分配
-
无可用大内存块,性能差,算法开销大
-
-
邻近适应算法(循环首次适应算法)
-
分配内存从上次查找结束的位置开始继续查找
-
常在末尾分配空间,导致尾部空间分裂成小碎块,每次分配无需排序链表
-
-
分页
-
引出分页:从连续到离散
-
概念
-
将主存空间划分为大小相等且固定的块作为主存的基本单位,进程以块为单位进行空间申请
-
页:逻辑地址空间中的块
-
页框:物理地址空间中的块
-
页面太小:进程页面过多,增加内存占用,降低硬件地址转换效率,缺页频繁(若请求分页)
-
页面太大:内部碎片过多,内存利用率低
-
-
-
-
基本地址变换机构
-
-
地址结构:页号+页内偏移
-
页表
-
逻辑地址到物理地址的映射
-
由页表项组成,页表项由页号(隐含)和对应物理块号组成
-
-
页表寄存器(唯一)
- 存放页表在内存中的起始地址和页表长度,这
-
计算方式
-
页号P = A / L,页内偏移量W = A % L
-
比较页号P和页表长度M,若P >= M产生越界中断
-
页表中页号P对应的页表项地址 = 页表始址F + 页号P × 页表项长度取出该页表项内物理块号b
-
计算物理地址E = b × L + W
-
-
-
问题一:每个页表项占多少字节?
问题二:如何实现地址的转换
子问题:如何确定一个逻辑地址对应的页号、页内偏移量?
多级页表及快表
-
为了提高内存空间利用率,页应该小,页小了则页表大引出多级页表
-
第一种尝试:只存放用到的页(用到的逻辑页才有页表项)会导致页表中页号不连续,不能使用偏移找到页表项,用顺序查找或折半查找会导致多次访存,效率极低
-
第二种尝试:多级页表(页目录表+页表)
- 好比看一本书单级页表只有节目录,每次要顺序查节目录,目录占用连续内存过大,多级目录就像增加了章目录,可以直接找到需要的章,在章下找小节,不用的章或节可以调出内存
-
-
逻辑地址空间格式 = 一级页号 + 二级页号 + 页内偏移
-
内存利用率提高,访存次数提高
-
-
- 好比看一本书单级页表只有节目录,每次要顺序查节目录,目录占用连续内存过大,多级目录就像增加了章目录,可以直接找到需要的章,在章下找小节,不用的章或节可以调出内存
-
快表
-
多级页表提高了空间效率,但时间上增加了访存次数,引入TLB(相联快速存储,寄存器)
-
地址变换机构中增加一个具有并行查找能力的高速缓冲存储器(快表),又称相联存储器(TLB)
- 相联存储器既可以按照地址查找,也可以按照内容查找
-
具有快表的地址变换机构
-
-
快表命中仅访存一次,快表未命中,需要访存两次(单级页表)
-
TLB有效访问时间 = HitR × (TLB + MA) + (1-HitR) × (TLB+2MA)
- 命中率:HitR、内存访问时间:MA、TLB时间:TLB,设为单级页表:仅2MA,
e.g. 有效访问时间=98%×(20ns+100ns)+2%×(20ns+200ns)=120ns
- 命中率:HitR、内存访问时间:MA、TLB时间:TLB,设为单级页表:仅2MA,
-
-
-
段页式
-
概念:作业的地址空间首先被分为若干逻辑段,每段有自己的段号,每个段分为若干大小固定的页
-
程序员希望用段,物理内存希望用页(段面向用户,页面向硬件)
-
虚拟内存(实现分段与分页的关键所在)
-
逻辑地址->虚拟地址(段表实现)
虚拟地址->物理地址(用户透明,页表实现)
- 此处有些疑惑,王道及查阅资料都认为逻辑地址和虚拟地址是一个东西
但此处讲解时,逻辑地址可以认为是程序员编写代码时用的,虚拟地址是段表映射到虚拟地址空间的地址
- 此处有些疑惑,王道及查阅资料都认为逻辑地址和虚拟地址是一个东西
-
-
段页式的故事
-
-
首先在虚拟内存上分配区域给用户的数据段,建立映射(建立段表)
-
将用户数据段分割为多页,每页与物理内存的页框关联在一起
-
利用段表记录虚拟内存是如何对应的,用页表记录虚拟存储的区域是咋么放到物理内存的
-
若父进程创建子进程
-
父子进程用相同的物理页,子进程在自己的虚拟内存空间中建立新的顶级页表,并分配内存建立新的二级页表,拷贝父进程的二级页表
-
父子进程共用只读的物理页,当子进程都需要写入时,需要重新分配一块物理页,修改页表映射
-
父子进程通过段表和页表进行内存分离
-
-
-
-
地址转变机构
-
-
一个进程对应一个段表多个页表
-
地址结构:段号S+页号P+页内偏移量W
-
-
请求分页管理方式
通过调页,用户可以随意使用内存,就像单独拥有4G内存
虚拟内存
-
最大容量:计算机地址结构(CPU寻址范围)决定
-
实际容量:min(内存外存容量和,CPU寻址范围)
地址转变机构
-
-
页表
-
页号
- 隐含
-
物理块号
-
状态位P
- 当前页是否已经调入内存
-
访问字段A
- 记录本页在一段时间内被访问次数/最近多久未被访问
-
修改位M
- 记录本页是否被修改过
-
外存地址
- 指出该页在外存上的位置(通常指物理块号)
-
-
缺页中断机构
-
当访问页面不在内存时就会产生缺页中断,请求操作系统将所缺页调入内存。
若内存中有空闲块则分配,若无空闲块则淘汰某页
-
内部中断,一条指令在执行期间,可能产生多次缺页中断
-
-
地址变换过程
-
-
检索快表,若找到访问页,则修改页表项中访问位
-
利用页表项中给出的物理块号和页内地址形成物理地址
-
没有找到改页的页表项,去内存中寻找页表,看是否已经调入内存
-
没有调入则产生缺页中断,请求从外存把该页调入内存
-
页面置换算法及页面分配策略
页面置换算法
-
概念串联(哈工大)
- 首先是最直观的FIFO,其次是需要知道未来信息最优的OPT/MIN
由于未来未知,用历史看未来,引出LRU算法,两种实现:时间戳和页面栈,执行代价太大,引入Clock算法,用最近没有使用近似最近最少使用
- 首先是最直观的FIFO,其次是需要知道未来信息最优的OPT/MIN
-
先进先出页面置换算法(FIFO)
-
优先淘汰最早进入内存的页面,即在内存中驻留时间最久的页面
-
Belady异常:增大分配的物理块数量,但缺页数不减反增
-
-
最佳置换算法(OPT/MIN)
- 选择永不使用或最长时间内不再访问的页面进行淘汰,保证获得最低的缺页率
-
最近最久未使用置换算法(LRU)
- 性能接近OPT算法,需要寄存器和栈的硬件支持,有两种实现:时间戳和页面栈,执行代价大(堆栈类算法)
-
CLOCK置换算法(NRU)
-
引入
- 为了解决LRU开销大问题,将时间计数变为是和否,用最近没有使用,近似最近最少使用(性能近似LRU算法)
-
概述
- 每个页面设置一个使用位(访问位),像一个时钟一样转圈,遇到没有被使用的就会将页面换出,然后将使用位置0,如果遇到使用的就会将使用位置0,然后扫描下一个
-
实现
-
首次装入内存/再次访问,使用位置1
-
若需淘汰一个页面时,循环扫描,若访问位为1,则置0;若访问位为0,则换出
-
-
-
改进CLOCK算法
-
使用位(访问位)基础上增加修改位
-
实现
-
扫描缓冲区,选择第一个使用位和修改位都为0的页面调出
- 即找(0,0)换出
-
第一步失败后,查找位为0,修改位为1的进行替换,对于每个跳过的帧,将使用位置0
- 即找(0,1)换出,(1,0)(1,1)--->(0,0)(0,1)
-
第二步失败后,指针回到初始地点(此时使用位均为0),重复第一步
-
-
页面分配策略
-
驻留集
- 给一个进程分配的物理页框集合,就是这个进程的驻留集
-
考虑因素
-
分配给一个进程的存储量越小,任何时候驻留在主存中的进程数就越多,可以提高处理机的时间利用率
-
一个进程在主存中的页数过少,页错误率就会相对较高
-
页数过多,对进程的错误率也不会产生过多的影响
-
-
分配策略
-
固定分配局部置换
-
每个进程分配固定物理块数,缺页时就进行换页
- 难以确定每个进程应该分配的物理块数,导致资源利用率低,缺页频繁
-
-
可变分配全局置换
- 进程分配一定物理块,系统自身保留一定空闲物理块,若进程缺页则分配新物理块(空闲物理块队列,动态调整)
-
可变分配局部置换
- 根据进程缺页情况,对物理块进行动态分配,若频繁缺页则多分配物理块,若缺页率低则减少物理块
-
-
调入页面时机
-
预调页策略
- 将不久被访问的页面调入(用于首次调入,程序员指定)
-
请求调页策略
- 当进程提出缺页时,再按照一定策略进行调页(一次调入一页,会花费过多I/O开销)
-
-
何处调页
-
拥有足够的对换区空间
- 可以全部从对换区调入所需页面,提高调页速度
-
缺少足够对换区空间
- 不会被修改的文件从文件区调入,可能被修改的部分换入对换区,以后再从对换区调入
-
UNIX方式
- 进程相关文件访问文件区,没有运行的页面从文件区调入,曾经运行过但被换出的页面放在对换区
-
抖动(颠簸)
-
概念:刚换出的页面又要换入内存(进程换页时间多于执行时间)
-
解释:系统内进程增多->每个进程的缺页率增大->缺页率增大到一定程度,进程总等待调页完成->CPU利用率降低->进程进一步增多,缺页率更大
-
原因:进程分配物理页帧数不够(主要)、置换算法不当
工作集(防止抖动):某段时间内,进程要访问的页面集合(设置工作窗口)
408 - 2023
28. 关于进程虚拟地址空间的叙述
问题: 对于采用虚拟内存管理方式的系统,下列关于进程虚拟地址空间的叙述中,错误的是( )。
A. 每个进程都有自己独立的虚拟地址空间
B. C语言中malloc()函数返回的是虚拟地址
C. 进程对数据段和代码段可以有不同的访问权限
D. 虚拟地址的大小由主存和硬盘的大小决定
参考答案:
正确答案是选项 D:虚拟地址的大小由主存和硬盘的大小决定。
解析:
-
A. 每个进程都有自己独立的虚拟地址空间:在采用虚拟内存管理方式的系统中,每个进程都有自己独立的虚拟地址空间,这样每个进程可以使用连续的地址空间,而不会相互干扰。因此,选项 A 正确。
-
B. C语言中malloc()函数返回的是虚拟地址:在C语言中,malloc()函数用于动态分配内存,并返回分配的内存块的起始地址。这个返回的地址是虚拟地址,它指向了进程的虚拟地址空间中的某一块内存。因此,选项 B 正确。
-
C. 进程对数据段和代码段可以有不同的访问权限:进程的虚拟地址空间通常包括代码段、数据段、堆区和栈区等,不同的区域可以有不同的访问权限。例如,代码段通常是只读的,而数据段可以是可读写的。因此,选项 C 正确。
-
D. 虚拟地址的大小由主存和硬盘的大小决定:虚拟地址的大小由底层的虚拟内存管理机制和操作系统决定,通常在不同的操作系统中有所不同。虚拟地址空间的大小是固定的,并不直接受主存和硬盘大小的影响。主存和硬盘的大小仅决定了虚拟存储器实际可用容量的最大值,而不决定虚拟地址空间的大小。因此,选项 D 错误。
综上所述,错误的叙述是选项 D:虚拟地址的大小由主存和硬盘的大小决定。
正确答案是选项 D:虚拟地址的大小由主存和硬盘的大小决定。
30. 进程共享数据的页号和页框号
问题: 进程 R 和 S 共享数据 data,若 data 在 R 和 S 中所在页的页号分别是 P1 和 P2,两个页所对应的页框号分别为 f1 和 f2,则下列叙述中正确的是( )。
A. P1 和 P2 一定相等,f1 和 f2 一定相等
B. P1 和 P2 一定相等,f1 和 f2 不一定相等
C. P1 和 P2 不一定相等,f1 和 f2 一定相等
D. P1 和 P2 不一定相等,f1 和 f2 不一定相等
根据题目描述,进程 R 和 S 共享数据 data,意味着它们映射了同一个共享内存段。以下是对每个选项的分析:
A. P1 和 P2 一定相等,f1 和 f2 一定相等:这种说法是不正确的。虽然进程 R 和 S 共享数据 data,但这并不意味着它们的页号和页框号必须相等。共享数据在不同进程的地址空间中可以有不同的页号,而在物理内存中的页框号可能是相同的。
B. P1 和 P2 一定相等,f1 和 f2 不一定相等:这是正确的说法。虽然共享数据的页号在不同进程中可以不同,但在物理内存中映射到的页框号可能相同,也可能不同。
C. P1 和 P2 不一定相等,f1 和 f2 一定相等:这种说法是不正确的。共享数据在不同进程的地址空间中的页号可以不同,而在物理内存中映射到的页框号必须相同,因为它们映射的是同一个物理内存页。
D. P1 和 P2 不一定相等,f1 和 f2 不一定相等:这种说法是正确的。共享数据在不同进程的地址空间中的页号和页框号都可以不相等。
根据以上分析,正确答案是选项 B:P1 和 P2 一定相等,f1 和 f2 不一定相等。
正确答案是选项 B:P1 和 P2 一定相等,f1 和 f2 不一定相等。
408-2022
29. 缺页异常处理过程中的操作
问题: 某进程访问的页b不在内存中,导致产生缺页异常,该缺页异常处理过程中不一定包含的操作是( )。
A. 淘汰内存中的页
B. 建立页号与页框号的对应关系
C. 将页b从外存读入内存
D. 修改页表中页b对应的存在位
参考答案:
正确答案是选项 A:淘汰内存中的页。
解析:
当某进程访问的页不在内存中时,会触发缺页异常。缺页异常处理过程中通常包括以下操作:
A. 淘汰内存中的页:当内存中没有空闲的页框时,需要选择一个页面进行置换,腾出空间用于新调入的页。这涉及到淘汰策略的选择,例如最近最少使用(LRU)算法等。
B. 建立页号与页框号的对应关系:当新调入的页从外存读取到内存时,需要将它与一个空闲的页框建立对应关系,以便进程可以访问该页。
C. 将页b从外存读入内存:由于页b不在内存中,需要从外存读取该页的内容,并将其放置在一个空闲的页框中。
D. 修改页表中页b对应的存在位:在进行页表更新时,需要修改页表中页b对应的存在位,将其标记为存在于内存中。
根据以上分析,缺页异常处理过程中不一定包含的操作是淘汰内存中的页,因为如果有空闲的页框可用,就不需要淘汰其他页。
因此,正确答案是选项 A:淘汰内存中的页。
正确答案是选项 A:淘汰内存中的页。
30. 不会影响系统缺页率的选项
问题: 下列选项中,不会影响系统缺页率的是( )。
A. 页面置换算法
B. 工作集的大小
C. 进程的数量
D. 页缓冲队列的长度
参考答案:
正确答案是选项 D:页缓冲队列的长度。
解析:
系统的缺页率是衡量页面置换和内存管理效果的指标。在给定的选项中,以下是对每个选项的分析:
A. 页面置换算法:不同的页面置换算法会对缺页率产生影响。一些算法如最佳(OPT)或最近最少使用(LRU)可以更有效地减少缺页率,而其他算法如先进先出(FIFO)可能导致较高的缺页率。
B. 工作集的大小:工作集的大小表示为每个进程分配的物理块数。如果一个进程被分配更多的物理块,那么它的缺页率可能会降低,因为更多的页面可以保留在内存中,减少了页面置换的需求。
C. 进程的数量:进程的数量与内存资源的竞争有关。如果有更多的进程需要共享有限的物理内存,那么每个进程被分配的物理块数就会减少,从而可能导致更高的缺页率。
D. 页缓冲队列的长度:页缓冲队列用于暂时缓存被淘汰的页面,以便稍后写回磁盘。队列长度可以影响页面置换的速度,但不会直接影响缺页率。
综上所述,不会影响系统缺页率的选项是选项 D:页缓冲队列的长度。
正确答案是选项 D:页缓冲队列的长度。
408-2021
28. 改进型Clock置换算法的地址变换
问题: 某请求分页存储系统的页大小为4KB,按字节编址。系统给进程P分配2个固定的页框,并采用改进型Clock置换算法,进程P页表的部分内容如下表所示。
页号 | 存在位 | 访问位 |
---|---|---|
01H | 0 | 1 |
02H | 0 | 0 |
03H | 1 | 0 |
04H | 1 | 1 |
若P访问虚拟地址为02A01H的存储单元,则经地址变换后得到的物理地址是( )。
A. 00A01H
B. 20A01H
C. 60A01H
D. 80A01H
参考答案:
正确答案是选项 C:60A01H。
解析:
根据题目给出的信息,可以得到以下观察结果:
- 页面大小为4KB,即每个页面的大小为4096字节。
- 低12位是页内偏移。
虚拟地址为02A01H,其中前8位(高8位)表示页号,最后12位表示页内偏移。
进行地址变换的步骤如下:
- 获取虚拟地址的页号:02H。
- 在进程P的页表中查找对应的页号02H的页表项。
- 根据页表项的存在位和访问位进行判断。
根据页表内容,我们可以得到以下观察结果:
- 页号02H的页表项存在位为0,表示页面不在内存中,需要进行页面置换。
- 进程P被分配了2个固定的页框,且内存中已有两个页面存在。
根据改进型Clock置换算法,我们选择将3号页(03H)换出,并将2号页(02H)放入60H页框。
因此,经过地址变换后,虚拟地址02A01H转换为物理地址的高20位为60H,低12位保持不变。
即:物理地址为60A01H。
因此,选项 C:60A01H 是经地址变换后得到的物理地址。
正确答案是选项 C:60A01H。
29. 二级页表中的CPU页表基址寄存器内容
问题: 在采用二级页表的分页系统中,CPU页表基址寄存器中的内容是( )。
A. 当前进程的一级页表的起始虚拟地址
B. 当前进程的一级页表的起始物理地址
C. 当前进程的二级页表的起始虚拟地址
D. 当前进程的二级页表的起始物理地址
参考答案:
正确答案是选项 B:当前进程的一级页表的起始物理地址。
解析:
在采用多级页表的分页系统中,每个进程拥有自己的页表来进行虚拟地址到物理地址的映射。对于二级页表的情况,一级页表和二级页表被使用来建立这种映射关系。
CPU页表基址寄存器(Page Table Base Register,简称PTBR)存放的是页表的起始物理地址,而不是虚拟地址。这样,通过将虚拟地址转换为物理地址时,CPU可以使用页表基址寄存器与页表项的偏移量来访问正确的页表项。
因此,在采用二级页表的分页系统中,CPU页表基址寄存器中的内容存放的是当前进程的一级页表的起始物理地址。
正确答案是选项 B:当前进程的一级页表的起始物理地址。
32. 通过系统调用完成的操作
问题: 下列选项中,通过系统调用完成的操作是( )。
A. 页置换
B. 进程调度
C. 建新进程
D. 生成随机整数
参考答案:
正确答案是选项 C:建新进程。
解析:
系统调用是用户进程与操作系统之间进行交互的一种方式。用户进程可以使用系统调用请求操作系统提供的服务和功能。以下是对每个选项的分析:
A. 页置换:页置换是操作系统在内存不足时将某些页面从内存中调出以便腾出空间,或将要访问的页面调入到内存中的过程。页置换是由操作系统自动进行的,不需要用户进程主动调用系统调用来执行。
B. 进程调度:进程调度是操作系统根据一定的策略决定哪个进程可以运行,并分配处理器时间给相应的进程。进程调度是由操作系统内核自动完成的,用户进程无法通过系统调用来直接进行进程调度。
C. 建新进程:通过系统调用,用户进程可以请求操作系统创建新的进程。例如,在Linux系统中,可以使用fork系统调用创建一个子进程。
D. 生成随机整数:生成随机数不涉及请求操作系统的服务,它通常是通过调用编程语言提供的特定函数来实现的,如C语言中的rand()函数。
综上所述,通过系统调用完成的操作是选项 C:建新进程。
正确答案是选项 C:建新进程。