操作系统~分页存储管理的基本概念与页面置换算法

分页存储管理的基本概念

传统的连续内存分配不管使用什么算法都有可能会造成内存的碎片化
而使用分页式的地址管理就可以有效降低内存碎片化

将内存空间分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个“页框”,或称“页帧”、“内存块”、“物理块”。每个页框有一个编号,即“页框号”(或者“内存块号”、“页帧号”、“物理块号”)页框号从o开始。

将用户进程的地址空间也分为与页框大小相等的一个个区域,称为“页”或“页面”。每个页面也有一个编号,即“页号”,页号也是从0开始。
(注:进程的最后一个页面可能没有一个页框那么大。因此,页框不能太大,否则可能产生过大的内部碎片)

操作系统以页框为单位为各个进程分配内存空间。进程的每个页面分别放入一个页框中。也就是说,进程的页面与内存的页框有一一对应的关系。

各个页面不必连续存放,也不必按先后顺序来,可以放到不相邻的各个页框中。

在这里插入图片描述

进程在内存中连续存放时,操作系统是如何实现逻辑地址到物理地址的转换的?

在这里插入图片描述
那分页存储的时候又该如何实现逻辑地址到物理地址的转换的?

CPU执行指令1,需要访问逻辑地址为80的内存单元,如何转化为物理地址?
在这里插入图片描述
逻辑地址为80的内存单元:
应该在1号页,该页在内存中的起始位置为450,逻辑地址为80的内存单元相对于该页的起始地址而言,“偏移量”应该是30。
实际物理地址= 450+ 30 = 480

1.要算出逻辑地址对应的页号
2.要知道该页号对应页面在内存中的起始地址
3.要算出逻辑地址在页面内的“偏移量”,
4.物理地址=页面始址+页内偏移量

如何计算:
页号=逻辑地址/页面长度(取除法的整数部分)
页内偏移量=逻辑地址%页面长度(取除法的余数部分)页面在内存中的起始位置:操作系统需要用某种数据结构记录进程各个页面的起始置。
页号=80/ 50= 1
页内偏移量=80 % 50 = 30
1号页在内存中存放的起始位置450
所以为480

页表

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

在这里插入图片描述
页表对应到块号, 由块号*块的大小就可以直接找到每个页在内存的物理地址

俩级页表

单级页表存在的问题

某计算机系统按字节寻址,支持32位的逻辑地址,采用分页存储管理,页面大小为4KB,页表项长度为4B。如果是16GB的内存那得分多少块, 一旦进程多了, 操作系统维护的页表也就很大, 这也是一个不必要的消耗

问题一:页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框。
问题二:没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问某几个特定的页面。

如何解决单级页表的问题?

将进程地址空间分页,并为其建立一张页表,记录各页面的存放位置
同样的思路也可用于解决“页表必须连续存放”的问题,把必须连续存放的页表再分页

在这里插入图片描述

页面置换算法

请求分页存储管理与基本分页存储管理的主要区别:
在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。
若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。
用页面置换算法决定应该换出哪个页面

最佳置换算法(OPT)

最佳置换算法(OPT,Optimal):每次选择淘汰的页面将是以后永不使用,或者在最长时间内不再被访问的页面,这样可以保证最低的缺页率。
例:假设系统为某进程分配了三个内存块,并考虑到有一下页面号引用串(会依次访问这些页面):7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
在这里插入图片描述
最佳置换算法可以保证最低的缺页率,但实际上,只有在进程执行的过程中才能知道接下来会访问到的是哪个页面。操作系统无法提前预判页面访问序列。因此,最佳置换算法是无法实现的。

先进先出置换算法(FIFO)

先进先出置换算法(FIFO):每次选择淘汰的页面是最早进入内存的页面
实现方法:把调入内存的页面根据调入的先后顺序排成一个队列,需要换出页面时选择队头页面即可。队列的最大长度取决于系统为进程分配了多少个内存块。
例:假设系统为某进程分配了四个内存块,并考虑到有以下页面号引用串:3,2,1,0,3,2,4,3,2,1,0,4
在这里插入图片描述
Belady异常―一当为进程分配的物理块数增大时,缺页次数不减反增的异常现象。
只有FIFO算法会产生Belady异常。另外,FIFO算法虽然实现简单,但是该算法与进程实际运行时的规律不适应,因为先进入的页面也有可能最经常被访问。因此,算法性能差

最近最久未使用置换算法(LRU)

最近最久未使用置换算法(LRU,least recently used):每次淘汰的页面是最近最久未使用的页面实现方法:赋予每个页面对应的页表项中,用访问字段记录该页面自上次被访问以来所经历的时间t。当需要淘汰一个页面时,选择现有页面中t值最大的,即最近最久未使用的页面。
该算法的实现需要专门的硬
例:假设系统为某进程分配了四个内存块,并考虑到有以下页面号引用
1,8,1, 7,8,2,7,2, 1 , 8 , 3, 8, 2, 1,3, 1,7,1,3, 7
在这里插入图片描述
该算法的实现需要专门的硬件支持,虽然算法性能好,但是实现困难,开销大

时钟置换算法((CLOCK)

最佳置换算法性能最好,但无法实现;先进先出置换算法实现简单,但算法性能差;最近最久未使用置换算法性能好,是最接近OPT算法性能的,但是实现起来需要专门的硬件支持,算法开销大。
时钟置换算法是一种性能和开销较均衡的算法,又称CLOCK算法,或最近未用算法(NRU,NotRecently Used)

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

访问位为1,表示最近访问过;访问位为0,表示最近没访问过
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Shangxingya/article/details/113803343