请注意,本文中的部分内容来自网络搜集和个人实践,如有任何错误,请随时向我们提出批评和指正。本文仅供学习和交流使用,不涉及任何商业目的。如果因本文内容引发版权或侵权问题,请通过私信告知我们,我们将立即予以删除。
创建进程时,首先在内存中找一块空闲的内存
将空闲地址(基地址)找到并赋值给PCB
程序载入到空闲内存后,PC置好初始地址然后执行,每次执行指令都要进行地址翻译
上下文切换时,PCB中的基址就进入基址寄存器
从写程序到程序运行
链接(概念见图片)
装入(概念见图片)
重定位(哈工大):修改程序中相对地址(逻辑地址)为绝对地址(物理地址)
时机(对应装入三种)
编译时(只能放固定地址,逻辑地址=物理地址)
载入(装入)时(载入时修改地址,慢但灵活)
运行时重定位:执行每条指令都要从逻辑地址算出物理地址(地址翻译),逻辑地址+基地址(从PCB中取)= 物理地址
物理地址空间
逻辑(虚拟)地址空间
即相对地址,链接程序依次按照各个模块的相对地址构成统一的从0单元开始编址的逻辑地址空间
实现分段与分页的关键所在,为了实现段页式引入,下文详述
程序员眼中程序由若干段组成,每个段有各自特点:代码段只读、代码/数据段不会动态增长(段内连续,段间不要求连续)
有段表程序进入内存的故事
程序分成多个段,每个段在内存中找到空闲的地方
每个空闲内存的基址放在LDT表(局部描述符表,段表)中,最后将该LDT表赋给PCB
每次执行指令时都查LDT表,将逻辑地址转变为物理地址
地址变换机构
地址结构:段号S+段内偏移量W
段表
每个进程都有一张映射逻辑地址空间和物理地址空间的段表,每个段表项对应进程的一段
段号(隐含)+段长+本段在主存中的始址
段的共享与保护
共享
保护
单一连续分配(内存仅有一道程序)
系统分为系统区和用户区,系统区仅供操作系统使用,通常在低地址部分,用户区为用户提供,内存中只存在一道程序
补充:不能被修改的代码为纯代码(可重入代码/非临界资源)
只适用于单用户单任务操作系统,存在内部碎片
固定分区分配
将用户空间划分为若干固定大小的区域,每个分区仅装入一道程序(适合多道程序存储,无外部碎片)
分区大小相等
分区大小不等
动态分区分配
进程装入内存时,根据进程大小动态建立分区
存在外部碎片
实现
首次适应算法
空闲分区按照地址递增的次序进行查找,第一个满足条件的进行分配
性能最好,开销小,回收分区后一般无需重新排序
最佳适应算法
按容量递增的顺序进行查询分区,将第一个满足条件的进行分配
尽可能留下大片空闲区,外部碎片最多,回收分区后可能需要重新排序
最坏适应算法(最大适应算法)
空闲分区按照容量递减的次序进行查找,第一个满足条件的进行分配
无可用大内存块,性能差,算法开销大
邻近适应算法(循环首次适应算法)
分配内存从上次查找结束的位置开始继续查找
常在末尾分配空间,导致尾部空间分裂成小碎块,每次分配无需排序链表
引出分页:从连续到离散
概念
基本地址变换机构
为了提高内存空间利用率,页应该小,页小了则页表大引出多级页表
第一种尝试:只存放用到的页(用到的逻辑页才有页表项)会导致页表中页号不连续,不能使用偏移找到页表项,用顺序查找或折半查找会导致多次访存,效率极低
第二种尝试:多级页表(页目录表+页表)
逻辑地址空间格式 = 一级页号 + 二级页号 + 页内偏移
内存利用率提高,访存次数提高
快表
多级页表提高了空间效率,但时间上增加了访存次数,引入TLB(相联快速存储,寄存器)
地址变换机构中增加一个具有并行查找能力的高速缓冲存储器(快表),又称相联存储器(TLB)
具有快表的地址变换机构
快表命中仅访存一次,快表未命中,需要访存两次(单级页表)
TLB有效访问时间 = HitR × (TLB + MA) + (1-HitR) × (TLB+2MA)
概念:作业的地址空间首先被分为若干逻辑段,每段有自己的段号,每个段分为若干大小固定的页
程序员希望用段,物理内存希望用页(段面向用户,页面向硬件)
虚拟内存(实现分段与分页的关键所在)
逻辑地址->虚拟地址(段表实现)
虚拟地址->物理地址(用户透明,页表实现)
段页式的故事
首先在虚拟内存上分配区域给用户的数据段,建立映射(建立段表)
将用户数据段分割为多页,每页与物理内存的页框关联在一起
利用段表记录虚拟内存是如何对应的,用页表记录虚拟存储的区域是咋么放到物理内存的
若父进程创建子进程
父子进程用相同的物理页,子进程在自己的虚拟内存空间中建立新的顶级页表,并分配内存建立新的二级页表,拷贝父进程的二级页表
父子进程共用只读的物理页,当子进程都需要写入时,需要重新分配一块物理页,修改页表映射
父子进程通过段表和页表进行内存分离
地址转变机构
一个进程对应一个段表多个页表
地址结构:段号S+页号P+页内偏移量W
最大容量:计算机地址结构(CPU寻址范围)决定
实际容量:min(内存外存容量和,CPU寻址范围)
页表
页号
物理块号
状态位P
访问字段A
修改位M
外存地址
缺页中断机构
当访问页面不在内存时就会产生缺页中断,请求操作系统将所缺页调入内存。
若内存中有空闲块则分配,若无空闲块则淘汰某页
内部中断,一条指令在执行期间,可能产生多次缺页中断
检索快表,若找到访问页,则修改页表项中访问位
利用页表项中给出的物理块号和页内地址形成物理地址
没有找到改页的页表项,去内存中寻找页表,看是否已经调入内存
没有调入则产生缺页中断,请求从外存把该页调入内存
概念串联(哈工大)
先进先出页面置换算法(FIFO)
优先淘汰最早进入内存的页面,即在内存中驻留时间最久的页面
Belady异常:增大分配的物理块数量,但缺页数不减反增
最佳置换算法(OPT/MIN)
最近最久未使用置换算法(LRU)
CLOCK置换算法(NRU)
引入
概述
实现
首次装入内存/再次访问,使用位置1
若需淘汰一个页面时,循环扫描,若访问位为1,则置0;若访问位为0,则换出
改进CLOCK算法
使用位(访问位)基础上增加修改位
实现
扫描缓冲区,选择第一个使用位和修改位都为0的页面调出
第一步失败后,查找位为0,修改位为1的进行替换,对于每个跳过的帧,将使用位置0
第二步失败后,指针回到初始地点(此时使用位均为0),重复第一步
驻留集
考虑因素
分配给一个进程的存储量越小,任何时候驻留在主存中的进程数就越多,可以提高处理机的时间利用率
一个进程在主存中的页数过少,页错误率就会相对较高
页数过多,对进程的错误率也不会产生过多的影响
分配策略
固定分配局部置换
每个进程分配固定物理块数,缺页时就进行换页
可变分配全局置换
可变分配局部置换
调入页面时机
预调页策略
请求调页策略
何处调页
概念:刚换出的页面又要换入内存(进程换页时间多于执行时间)
解释:系统内进程增多->每个进程的缺页率增大->缺页率增大到一定程度,进程总等待调页完成->CPU利用率降低->进程进一步增多,缺页率更大
原因:进程分配物理页帧数不够(主要)、置换算法不当
问题: 对于采用虚拟内存管理方式的系统,下列关于进程虚拟地址空间的叙述中,错误的是( )。
A. 每个进程都有自己独立的虚拟地址空间
B. C语言中malloc()函数返回的是虚拟地址
C. 进程对数据段和代码段可以有不同的访问权限
D. 虚拟地址的大小由主存和硬盘的大小决定
参考答案:
正确答案是选项 D:虚拟地址的大小由主存和硬盘的大小决定。
解析:
A. 每个进程都有自己独立的虚拟地址空间:在采用虚拟内存管理方式的系统中,每个进程都有自己独立的虚拟地址空间,这样每个进程可以使用连续的地址空间,而不会相互干扰。因此,选项 A 正确。
B. C语言中malloc()函数返回的是虚拟地址:在C语言中,malloc()函数用于动态分配内存,并返回分配的内存块的起始地址。这个返回的地址是虚拟地址,它指向了进程的虚拟地址空间中的某一块内存。因此,选项 B 正确。
C. 进程对数据段和代码段可以有不同的访问权限:进程的虚拟地址空间通常包括代码段、数据段、堆区和栈区等,不同的区域可以有不同的访问权限。例如,代码段通常是只读的,而数据段可以是可读写的。因此,选项 C 正确。
D. 虚拟地址的大小由主存和硬盘的大小决定:虚拟地址的大小由底层的虚拟内存管理机制和操作系统决定,通常在不同的操作系统中有所不同。虚拟地址空间的大小是固定的,并不直接受主存和硬盘大小的影响。主存和硬盘的大小仅决定了虚拟存储器实际可用容量的最大值,而不决定虚拟地址空间的大小。因此,选项 D 错误。
综上所述,错误的叙述是选项 D:虚拟地址的大小由主存和硬盘的大小决定。
正确答案是选项 D:虚拟地址的大小由主存和硬盘的大小决定。
问题: 进程 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 不一定相等。
问题: 某进程访问的页b不在内存中,导致产生缺页异常,该缺页异常处理过程中不一定包含的操作是( )。
A. 淘汰内存中的页
B. 建立页号与页框号的对应关系
C. 将页b从外存读入内存
D. 修改页表中页b对应的存在位
参考答案:
正确答案是选项 A:淘汰内存中的页。
解析:
当某进程访问的页不在内存中时,会触发缺页异常。缺页异常处理过程中通常包括以下操作:
A. 淘汰内存中的页:当内存中没有空闲的页框时,需要选择一个页面进行置换,腾出空间用于新调入的页。这涉及到淘汰策略的选择,例如最近最少使用(LRU)算法等。
B. 建立页号与页框号的对应关系:当新调入的页从外存读取到内存时,需要将它与一个空闲的页框建立对应关系,以便进程可以访问该页。
C. 将页b从外存读入内存:由于页b不在内存中,需要从外存读取该页的内容,并将其放置在一个空闲的页框中。
D. 修改页表中页b对应的存在位:在进行页表更新时,需要修改页表中页b对应的存在位,将其标记为存在于内存中。
根据以上分析,缺页异常处理过程中不一定包含的操作是淘汰内存中的页,因为如果有空闲的页框可用,就不需要淘汰其他页。
因此,正确答案是选项 A:淘汰内存中的页。
正确答案是选项 A:淘汰内存中的页。
问题: 下列选项中,不会影响系统缺页率的是( )。
A. 页面置换算法
B. 工作集的大小
C. 进程的数量
D. 页缓冲队列的长度
参考答案:
正确答案是选项 D:页缓冲队列的长度。
解析:
系统的缺页率是衡量页面置换和内存管理效果的指标。在给定的选项中,以下是对每个选项的分析:
A. 页面置换算法:不同的页面置换算法会对缺页率产生影响。一些算法如最佳(OPT)或最近最少使用(LRU)可以更有效地减少缺页率,而其他算法如先进先出(FIFO)可能导致较高的缺页率。
B. 工作集的大小:工作集的大小表示为每个进程分配的物理块数。如果一个进程被分配更多的物理块,那么它的缺页率可能会降低,因为更多的页面可以保留在内存中,减少了页面置换的需求。
C. 进程的数量:进程的数量与内存资源的竞争有关。如果有更多的进程需要共享有限的物理内存,那么每个进程被分配的物理块数就会减少,从而可能导致更高的缺页率。
D. 页缓冲队列的长度:页缓冲队列用于暂时缓存被淘汰的页面,以便稍后写回磁盘。队列长度可以影响页面置换的速度,但不会直接影响缺页率。
综上所述,不会影响系统缺页率的选项是选项 D:页缓冲队列的长度。
正确答案是选项 D:页缓冲队列的长度。
问题: 某请求分页存储系统的页大小为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。
解析:
根据题目给出的信息,可以得到以下观察结果:
虚拟地址为02A01H,其中前8位(高8位)表示页号,最后12位表示页内偏移。
进行地址变换的步骤如下:
根据页表内容,我们可以得到以下观察结果:
根据改进型Clock置换算法,我们选择将3号页(03H)换出,并将2号页(02H)放入60H页框。
因此,经过地址变换后,虚拟地址02A01H转换为物理地址的高20位为60H,低12位保持不变。
即:物理地址为60A01H。
因此,选项 C:60A01H 是经地址变换后得到的物理地址。
正确答案是选项 C:60A01H。
问题: 在采用二级页表的分页系统中,CPU页表基址寄存器中的内容是( )。
A. 当前进程的一级页表的起始虚拟地址
B. 当前进程的一级页表的起始物理地址
C. 当前进程的二级页表的起始虚拟地址
D. 当前进程的二级页表的起始物理地址
参考答案:
正确答案是选项 B:当前进程的一级页表的起始物理地址。
解析:
在采用多级页表的分页系统中,每个进程拥有自己的页表来进行虚拟地址到物理地址的映射。对于二级页表的情况,一级页表和二级页表被使用来建立这种映射关系。
CPU页表基址寄存器(Page Table Base Register,简称PTBR)存放的是页表的起始物理地址,而不是虚拟地址。这样,通过将虚拟地址转换为物理地址时,CPU可以使用页表基址寄存器与页表项的偏移量来访问正确的页表项。
因此,在采用二级页表的分页系统中,CPU页表基址寄存器中的内容存放的是当前进程的一级页表的起始物理地址。
正确答案是选项 B:当前进程的一级页表的起始物理地址。
问题: 下列选项中,通过系统调用完成的操作是( )。
A. 页置换
B. 进程调度
C. 建新进程
D. 生成随机整数
参考答案:
正确答案是选项 C:建新进程。
解析:
系统调用是用户进程与操作系统之间进行交互的一种方式。用户进程可以使用系统调用请求操作系统提供的服务和功能。以下是对每个选项的分析:
A. 页置换:页置换是操作系统在内存不足时将某些页面从内存中调出以便腾出空间,或将要访问的页面调入到内存中的过程。页置换是由操作系统自动进行的,不需要用户进程主动调用系统调用来执行。
B. 进程调度:进程调度是操作系统根据一定的策略决定哪个进程可以运行,并分配处理器时间给相应的进程。进程调度是由操作系统内核自动完成的,用户进程无法通过系统调用来直接进行进程调度。
C. 建新进程:通过系统调用,用户进程可以请求操作系统创建新的进程。例如,在Linux系统中,可以使用fork系统调用创建一个子进程。
D. 生成随机整数:生成随机数不涉及请求操作系统的服务,它通常是通过调用编程语言提供的特定函数来实现的,如C语言中的rand()函数。
综上所述,通过系统调用完成的操作是选项 C:建新进程。
正确答案是选项 C:建新进程。