操作系统第三章:内存管理

本文深入探讨了内存管理的各种策略和技术,包括内存基础知识、内存分配与回收、地址转换、内存保护、覆盖与交换。详细阐述了连续分配、动态分区、分页和分段存储管理方式,以及虚拟内存的概念和请求分页系统。讨论了各种页面置换算法如最佳置换、FIFO、LRU等,并介绍了页面分配策略和工作集理论。此外,还涵盖了快表在地址变换中的作用和两级页表的应用。

内存的基础知识

内存用来存放要执行的程序,因为从硬盘存取太慢了,为了提高CPU利用率整了内存这个东西,解决CPU和硬盘之间的速度矛盾。

在这里插入图片描述

如果按字编址的话,计算机是32位的,每个存储单元为32个二进制位(4B)

在这里插入图片描述
2^10=1024
操作系统里的进制都是2^10
1G=2^10 M

逻辑地址(相对地址):相对于起始地址而言的地址

物理地址(绝对地址):真正存放的位置

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

可以移动,只需要改一下重定位寄存器就行了。

可以把程序分配到不连续的内存空间里

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

内存管理的概念

1.内存空间的分配和回收

在这里插入图片描述

2.内存空间的扩充

在这里插入图片描述

3.地址转换

在这里插入图片描述

4.内存保护

在这里插入图片描述
在这里插入图片描述

小结

在这里插入图片描述

覆盖与交换

1.覆盖技术

在这里插入图片描述
在这里插入图片描述
A调用B、C,一次只能调用其中一个,所有覆盖区选两者之间更大的,下面同理,选最大的就行。(BC存在才能调用下面的所以新开一个覆盖区)

2.交换技术

在这里插入图片描述
换到外存等待的进程就是挂起状态

中级调度(内存调度)就是决定把哪个挂起的进程调回内存

小结

在这里插入图片描述

连续分配管理方式

为进程分配的必须是一个连续的内存空间

1.单一连续分配

在这里插入图片描述

2.固定分区分配

在这里插入图片描述
在这里插入图片描述

3.动态分区分配

不会预先划分分区,而是在进程进入时建立一个刚好满足需要的分区
在这里插入图片描述
在这里插入图片描述
内部碎片:分配给进程的区域没用上的部分

外部碎片:由于分配给进程导致有些地方太小,不能利用

在这里插入图片描述
分配和回收之后要对空闲分区表进行修改,记得分区大小和起始地址都要改(有可能还要进行合并删除这些,具体分析)

小结

在这里插入图片描述

动态分区分配算法

在这里插入图片描述
首次适应算法:从低地址开始,找到第一个能满足要求的空闲分区

最佳适应算法:从小的开始找,很多时候还要对空间分区重新排列(维持从小到大的顺序)

最坏适应算法:从大的开始找

邻近适应算法:从上一次结束的地方开始查找(雨露均沾),可以用循环链表实现

在这里插入图片描述

小结

在这里插入图片描述

分页存储管理的概念

1.页面页框

在这里插入图片描述
把进程分为一个个页面(页),内存空间分为页框(页帧、内存块、物理块)。

这两个是对应的,也就是说页面大小和页框大小肯定是一样的,因为要把一个页面刚好放到一个页框中去,页框不能太大否则会造成很大的内部碎片(最后一个页面没有那么大)。

页面随便往各个页框放就行了,这就是非连续分配

2.页表

在这里插入图片描述
在这里插入图片描述
220 个内存块用20个二进制位表示,也就是至少用3B表示块号(1B=8bit,2个明显是不够的)

在这里插入图片描述
页号是隐含的:知道页表的起始地址X,用刚刚的计算过程可以得到页表项的大小是3B,i号页表的存放地址=X+3*i。所以可以不用存储页号,通过计算获得就行了。

页表只是记录内存块号,不是记录内存块的地址,J号内存块的地址还是得用 J * 内存块大小来得到

3.地址转换

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
页面大小通过换算就可以确定页面偏移量占多少位(页面大小就决定了页面偏移量最多是多少),剩余的位数就表示页号

物理块号拼接上页内偏移量就是物理地址(表示物理块号的位数相当于乘了后面的页面大小,再加上页内偏移量就得出)

在这里插入图片描述

手算的方法还是要掌握,有些怪的就只能用手算

小结

在这里插入图片描述

基本地址变换机构

通常会在系统中设置一个页表寄存器(PTR),存放页表在内存中的起始地址F和页表长度M。(每个进程都有自己的页表)

进程未执行时,页表的始址和页表长度放在进程控制块(PCB)中,当进程被调度时,操作系统内核会把它们放到页表寄存器中。

在这里插入图片描述
在这里插入图片描述
页式管理中地址是一维的,因为只需要给出逻辑地址,其他都可以自动算出来。

页表项的大小为3B的话,如果页框大小为4KB放在内存中会使页框剩下1B(因为不能整除),这样会使计算内存地址的时候不能简单的用乘法来计算了(毕竟每个页框里都有1B空的,所以要在每次跳到下一个页框的时候都加上1B)。所以可以把页表项弄成4B,这样就可以正好装满,也是连续的,就可以直接使用乘法计算物理地址了。
在这里插入图片描述

在这里插入图片描述

具有快表的地址变换机构

1.局部性原理

在这里插入图片描述
时间局部性:被访问过的不久后可能再次被访问

空间局部性:被访问过的附近的存储单元可能被访问

2.快表

快表,又称联想寄存器(TLB,translation lookaside buffer ),是一种访问速度比内存快很多的高速缓存(TLB不是内存!),用来存放最近访问的页表项的副本,可以加速地址变换的速度。与此对应,内存中的页表常称为慢表。

在这里插入图片描述
快表命中,仅需一次访存
快表未命中,两次访存(去页表查找内存号,再访问目标页面),找到页表项还要添加到快表里去

小结

在这里插入图片描述

两级页表

在这里插入图片描述
给页表分配这么多连续的空间,丢掉了本来非连续存储的优点

根据局部性原理,很多时候只需要一些页面在内存里就行了,没必要让整个页表都常驻内存

把页表再分页并离散存储,然后再建立一张页表记录页表各个部分的存放位置,称为页目录表(外层页表、顶层页表)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
前面曾说过,缺页中断率高代表内存紧张(很多页面都被调到外存去了)

在这里插入图片描述
两级页表要进行三次访存(n级 n+1次),有快表的话还是只需要一次(命中就直接访问目标)

在这里插入图片描述

分段存储

1.基本概念

在这里插入图片描述
按照功能划分为各个段,每个段占据连续空间,段与段之间可以分散的随便放。

在这里插入图片描述
在这里插入图片描述
段表项大小的计算:段表项由段长、基址组成,段长看段内地址(决定最大段长),基址由内存大小决定,最后让这两个加起来就可以得出段表项大小。

2.地址变换

在这里插入图片描述
要根据段表中记录的段长检查段内地址有没有越界

3.分段vs分页

在这里插入图片描述
在这里插入图片描述

不能被修改的代码称为纯代码或可重入代码(不属于临界资源),这样的代码是可以共享的。可修改的代码是不能共享的(比如,有一个代码段中有很多变量,各进程并发地同时访问可能造成数据不一致)

在这里插入图片描述

小结

在这里插入图片描述

段页式管理方式

在这里插入图片描述
分段之后再分页

在这里插入图片描述
段页式的地址结构是二维的

在这里插入图片描述
每个段的页表长度是不同的(因为段长就是不同的,页表长度就代表分成了几个页)

在这里插入图片描述
需要三次访存

在这里插入图片描述

虚拟内存的基本概念

在这里插入图片描述
虚拟内存有一下三个主要特征:

①多次性:无需在作业运行时一次性全部装入内存,而是允许被分成多次调入内存。

②对换性:在作业运行时无需一直常驻内存,而是允许在作业运行过程中,将作业换入、换出。

③虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存容量,远大于实际的容量。

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

在这里插入图片描述

请求分页管理方式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
若未调入内存,调入后修改页表和快表。调出去的时候要记得把快表里的内容也删了。(免得命中了去访问)

在这里插入图片描述
一般修改的时候改快表就行了(反正查的时候会查快表),要删除快表的时候(调出内存)才把它里面的值好好的改回慢表里,然后写到外存去

换入换出都需要用到I/O,这是比较慢的过程

在这里插入图片描述

页表置换算法

用页面置换算法决定应该换出哪个页面

页面的换入、换出需要磁盘I/O,会有较大的开销,因此好的页面置换算法应该追求更少的缺页率

1.最佳置换算法(OPT)

在这里插入图片描述

无法实现的一种算法,作为一种评判标准(因为怎么可能知道后面要用到的页面顺序)

2.先进先出置换算法(FIFO)

在这里插入图片描述
每次就把最先进来的页面置换出去

性能差,只有它会产生Belady现象

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

在这里插入图片描述
最接近最佳置换算法,但是想做到计时的话要借助硬件,所以虽然性能好,但是开销大

4.时钟置换算法(CLOCK,NRU)

在这里插入图片描述
是1就置为0,然后继续下一个直到找到0(所以最多两轮就可以找到)

如果是0的,被访问了又把它改成1

5.改进时钟置换算法

在这里插入图片描述
多考虑了一个修改位,如果同样没访问过优先置换出去没修改过的(这样不用执行I/O把这个修改写回外存)

第一轮找(0,0)
第二轮找(0,1),同时把访问位是1的都改成0
第三轮找(0,0)【之前的(1,0)】
第四轮找(0,1)【之前的(1,1)】

最多找四轮

小结

在这里插入图片描述

页面分配策略

在这里插入图片描述
在这里插入图片描述
可变分配全局置换:只要缺页就从别的地方拿个物理块

可变分配局部置换:缺页的时候从自己的物理块置换,如果缺页率过高就拿物理块,缺页率较低就分出去物理块(适当的时候就靠自己)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
工作集:某时刻,实际访问页面的集合(看看究竟在用几个进程,就可以用来调整驻留集了)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值