五天自学完 王道考研-操作系统 第三章 段页式管理方式、虚拟内存

非连续分配管理方式:为用户进程分配的可以是一些分散的内存空间

基本分页存储管理的基本概念

基本分页存储管理的思想:把内存分为一个个相等的小分区,再按照分区大小把进程拆分成一个个小部分
1.将内存空间分为一个个大小相等的分区,每个分区就是一个“页框”,或称“页帧”、“内存块”、“物理块”。
每个页框有一个编号,即“页框号”(或者“内存块号”、“页帧号”、“物理块号”),页框号从0开始。
2.将用户进程的地址空间也分为与页框大小相等的一个个区域,称为“”或“页面”。
每个页面也有一个编号,即“页号”,页号也是从0开始。
(注:进程的最后一个页面可能没有一个页框那么大。因此,页框不能太大,否则可能产生过大的内部碎片)
操作系统以页框为单位为各个进程分配内存空间。进程的每个页面分别放入一个页框中。
进程的页面与内存的页框有一一对应的关系
各个页面不必连续存放,也不必按先后顺序来,可以放到不相邻的各个页框中。
在这里插入图片描述

如何实现地址的转换?

1.要算出逻辑地址对应的页号:页号 = 逻辑地址/页面长度(取除法的整数部分)
2.要知道该页号对应页面在内存中的起始地址:操作系统需要用某种数据结构记录进程各个页面的起始位置
3.要算出逻辑地址在页面内的“偏移量”:页内偏移量 = 逻辑地址%页面长度(取除法的余数部分)
4.物理地址=页面始址+页内偏移量:

为了方便计算页号、页内偏移量,页面大小一般设为2的整数幂
结论:如果每个页面大小为2kB,用二进制数表示逻辑地址,则末尾K位即为页内偏移量其余部分就是页号
因此,如果让每个页面的大小为2的整数幂,计算机就可以很方便地得出一个逻辑地址对应的页号和页内偏移量。
在这里插入图片描述
如果有K位表示“页内偏移量”,则说明该系统中一个页面的大小是2k个内存单元
如果有M位表示“页号”,则说明在该系统中,一个进程最多允许有2M个页面

页表:为了能知道进程的每个页面在内存中存放的位置,操作系统要为每个进程建立一张页表。

在这里插入图片描述

1.一个进程对应一张页表
2.进程的每一页对应一个页表项
3.每个页表项由“页号”和“块号”组成
4.页表记录进程页面和实际存放的内存块之间的对应关系
5.每个页表项的长度是相同的,页号是“隐含”的
在这里插入图片描述
在这里插入图片描述

基本地址变换机构:用于实现逻辑地址到物理地址转换的一组硬件机构

基本地址变换机构可以借助进程的页表 将逻辑地址转换为物理地址
通常会在系统中设置一个页表寄存器(PTR),存放页表在内存中的起始地址 F页表长度 M
进程未执行时,页表的始址和页表长度放在进程控制块(PCB)中,当进程被调度时,操作系统内核会把它们放到页表寄存器中。
在这里插入图片描述
在这里插入图片描述
在分页存储管理(页式管理)的系统中,只要确定了每个页面的大小,逻辑地址结构就确定了。因此,页式管理中地址是一维的。即,只要给出一个逻辑地址,系统就可以自动地算出页号、页内偏移量两个部分,并不需要显式地告诉系统这个逻辑地址中,页内偏移量占多少位。
为了方便找到页表项,进程的页表通常是装在连续的内存块中的
访问两次内存:查页表、访问目标内存单元

具有快表的地址变换机构:

时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行;如果某个数据被访问过,不久之后该数据很可能再次被访问。(因为程序中存在大量的循环)
空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。(因为很多数据在内存中都是连续存放的)
快表,又称联想寄存器((TLB),是一种访问速度比内存快很多的高速缓冲存储器,用来存放当前访问的若干页表项,以加速地址变换的过程。与此对应,内存中的页表常称为慢表。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
计组学的好的这一部分就没问题

两级页表

在这里插入图片描述

在这里插入图片描述
根据局部性原理可知,很多时候,进程在一段时间内只需要访问某几个页面就可以正常运行了。因此没有必要让整个页表都常驻内存
在这里插入图片描述
1.若采用多级页表机制,则各级页表的大小不能超过一个页面
2.两级页表的访存次数分析(假设没有快表机构)
第一次访存:访问内存中的页目录表
第二次访存:访问内存中的二级页表
第三次访存:访问目标内存单元
在这里插入图片描述

基本分段存储管理方式

进程的地址空间:按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名(在低级语言中,程序员使用段名来编程),每段从0开始编址
内存分配规则:以段为单位进行分配,每个段在内存中占据连续空间,但各段之间可以不相邻
由于是按逻辑功能模块划分,用户编程更方便,程序的可读性更高
在这里插入图片描述
在这里插入图片描述

1.每个段对应一个段表项,其中记录了该段在内存中的起始位置(又称“基址”)和段的长度
2.各个段表项的长度是相同的。段号可以是隐含的,不占存储空间。

在这里插入图片描述

分段、分页管理的对比

是信息的物理单位。分页的主要目的是为了实现离散分配,提高内存利用率。分页仅仅是系统管理上的需要,完全是系统行为,对用户是不可见的
是信息的逻辑单位。分段的主要目的是更好地满足用户需求。一个段通常包含着一组属于一个逻辑模块的信息。分段对用户是可见的,用户编程时需要显式地给出段名。

页的大小固定且由系统决定。段的长度却不固定,决定于用户编写的程序。

分页的用户进程地址空间是一维的,程序员只需给出一个记忆符即可表示一个地址。
分段的用户进程地址空间是二维的,程序员在标识一个地址时,既要给出段名,也要给出段内地址。

分段比分页更容易实现信息的共享和保护
页面不是按逻辑模块划分的,所以就很难实现共享。
不能被修改的代码称为纯代码或可重入代码不属于临界资源),这样的代码是可以共享的。可修改的代码是不能共享的。

访问一个逻辑地址需要几次访存?
分页(单级页表)∶总共两次访存
第一次访存――查内存中的页表
第二次访存――访问目标内存单元。
分段:总共两次访存
第一次访存――查内存中的段表
第二次访存――访问目标内存单元。
与分页系统类似,分段系统中也可以引入快表机构,将近期访问过的段表项放到快表中,这样可以少一次访问,加快地址变换速度。

在这里插入图片描述

在这里插入图片描述

段页式管理方式

在这里插入图片描述
段号的位数决定了每个进程最多可以分几个段
页号位数决定了每个段最大有多少页
页内偏移量决定了页面大小、内存块大小是多少

“分段”对用户是可见的,程序员编程时需要显式地给出段号、段内地址。而将各段“分页”对用户是不可见的。系统会根据段内地址自动划分页号和页内偏移量。
因此段页式管理的地址结构是二维的。
在这里插入图片描述
在这里插入图片描述

虚拟内存的基本概念

传统存储管理方式的特征、缺点

一次性:作业必须一次性全部装入内存后才能开始运行。
这会造成两个问题:①作业很大时,不能全部装入内存,导致大作业无法运行;
②当大量作业要求运行时,由于内存无法容纳所有作业,因此只有少量作业能运行,导致多道程序并发度下降

驻留性:一旦作业被装入内存,就会一直驻留在内存中,直至作业运行结束。
事实上,在一个时间段内,只需要访问作业的一小部分数据即可正常运行,这就导致了内存中会驻留大量的、暂时用不到的数据,浪费了宝贵的内存资源。内存利用率不高

虚拟内存的定义和特征

基于局部性原理,在程序装入时,可以将程序中很快会用到的部分装入内存,暂时用不到的部分留在外存,就可以让程序开始执行。
在程序执行过程中,当所访问的信息不在内存时由操作系统负责将所需信息从外存调入内存,然后继续执行程序。
内存空间不够由操作系统负责将内存中暂时用不到的信息换出到外存
在操作系统的管理下,在用户看来似乎有一个比实际内存大得多的内存,这就是虚拟内存

易混知识点:
虚拟内存的最大容量是由计算机的地址结构(CPU寻址范围)确定的
虚拟内存的实际容量= min(内存和外存容量之和,CPU寻址范围)
在这里插入图片描述
虚拟内存有一下三个主要特征:
多次性:无需在作业运行时一次性全部装入内存,而是允许被分成多次调入内存。
对换性:在作业运行时无需一直常驻内存,而是允许在作业运行过程中,将作业换入、换出。
虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存容量,远大于实际的容量。

如何实现虚拟内存技术

虚拟内存技术,允许一个作业分多次调入内存。如果采用连续分配方式,会不方便实现。因此,虚拟内存的实现需要建立在离散分配的内存管理方式基础上。

在这里插入图片描述

请求分页管理方式

页表机制

与基本分页管理相比,请求分页管理中,为了实现“请求调页”,操作系统需要知道每个页面是否已经调入内存;如果还没调入,那么也需要知道该页面在外存中存放的位置。
当内存空间不够时,要实现“页面置换”,操作系统需要通过某些指标来决定到底换出哪个页面;有的页面没有被修改过,就不用再浪费时间写回外存。有的页面修改过,就需要将外存中的旧数据覆盖,因此,操作系统也需要记录各个页面是否被修改的信息。

在这里插入图片描述

缺页中断机构

缺页中断是因为当前执行的指令想要访问的目标页面未调入内存而产生的,因此属于内中断
一条指令在执行过程中可能产生多次缺页中断

在请求分页系统中,每当要访问的页面不在内存时,便产生一个缺页中断,然后由操作系统的缺页中断处理程序处理中断。
此时缺页的进程阻塞,放入阻塞队列,调页完成后再将其唤醒,放回就绪队列。

如果内存中有空闲块,则为进程分配一个空闲块,将所缺页面装入该块,并修改页表中相应的页表项。
如果内存中没有空闲块,则由页面置换算法选择一个页面淘汰,若该页面在内存期间被修改过,则要将其写回外存。未修改过的页面不用写回外存。

地址变换机构

在这里插入图片描述

在这里插入图片描述

页面置换算法

页面的换入、换出需要磁盘I/O,会有较大的开销,因此好的页面置换算法应该追求更少的缺页率
注意:缺页时未必发生页面置换。若还有可用的空闲内存块,就不用进行页面置换。

最佳置换算法(OPT):缺页且需要替换时,选择从此之后最晚出现的那个页面被替换

理想算法,无法实现

先进先出置换算法(FIFO)

Belady异常——当为进程分配的物理块数增大时,缺页次数不减反增的异常现象。

只有FIFO算法会产生Belady异常。另外,FIFO算法虽然实现简单,但是该算法与进程实际运行时的规律不适应,因为先进入的页面也有可能最经常被访问。因此,算法性能差

最近最久未使用置换算法(LRU):缺页且需要替换时,选择从此之前最早出现的那个页面被替换

在这里插入图片描述
在这里插入图片描述
该算法的实现需要专门的硬件支持,虽然算法性能好,但是实现困难,开销大

时钟置换算法(CLOCK)、最近未用算法(NRU)

简单的CLOCK算法实现方法:为每个页面设置一个访问位,再将内存中的页面都通过链接指针链接成一个循环队列
当某页被访问时,其访问位置为1。当需要淘汰一个页面时,只需检查页的访问位。如果是0,就选择该页换出;如果是1,则将它置为0,暂不换出,继续检查下一个页面,若第一轮扫描中所有页面都是1,则将这些页面的访问位依次置为0后,再进行第二轮扫描(第二轮扫描中一定会有访问位为0的页面,因此简单的CLOCK算法选择一个淘汰页面最多会经过两轮扫描)

改进型的时钟置换算法

简单的时钟置换算法仅考虑到一个页面最近是否被访问过。事实上,如果被淘汰的页面没有被修改过,就不需要执行l/O操作写回外存。
只有被淘汰的页面被修改过时,才需要写回外存。
因此,除了考虑一个页面最近有没有被访问过之外,操作系统还应考虑页面有没有被修改过。在其他条件都相同时,应优先淘汰没有修改过的页面,避免I/O操作。这就是改进型的时钟置换算法的思想。
修改位=0,表示页面没有被修改过;修改位=1,表示页面被修改过。
在这里插入图片描述

由于第二轮已将所有帧的访问位设为0,因此经过第三轮、第四轮扫描一定会有一个帧被选中,因此改进型CLOCK置换算法选择一个淘汰页面最多会进行四轮扫描

在这里插入图片描述

页面分配策略

在这里插入图片描述
在这里插入图片描述
何时调入页面?
在这里插入图片描述
从何处调入页面?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存,这种频繁的页面调度行为称为抖动,或颠簸
产生抖动的主要原因是进程频繁访问的页面数目高于可用的物理块数(分配给进程的物理块不够)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/tfnmdmx/article/details/119282613
今日推荐