参考视频:王道计算机考研 操作系统_哔哩哔哩_bilibili
参考书籍:左万利《计算机操作系统教程(第4版)》
目录
第三章 内存管理
一、内存管理的功能
存储管理既包括内存资源的管理,也包括实现分级存储体系的外存资源的管理。
1.存储分配和去配
一个作业进入内存时,操作系统需要将其变为进程,并为进程分配存储空间。进程运行结束后,再将其占用的存储空间收回。
对于具有虚拟存储管理功能的操作系统来说,进程在运行过程中一部分处于内存,另一部分处于外存储器。当处于外存储器的部分需要调入内存时,操作系统应当为其分配内存空间,同时收回外存空间;当处于内存的部分需要调出内存时,操作系统应当为其分配外存空间,同时收回内存空间。
为实现存储资源的分配与收回,操作箱体需要记录内存资源和外存资源的使用情况。在有虚拟存储管理的系统中,内存和外存储器各需一个分配表(记录已经分配的区域)和一个空闲表(记录尚未分配的区域)。
2.存储共享
多个进程共用内存中的相同区域,即它们物理空间有相交的部分。
1️⃣存储共享的目的(1)节省内存空间;(2)实现进程间通信。
2️⃣存储共享的内容(1)代码共享;(2)数据共享。
3.存储保护
在多道程序系统中,内存空间既有操作系统,又有用户进程。因此必须对内存空间加以保护,保证各进程在各自存储空间内运行,互不干扰。存储保护包括以下内容。
(1)防止地址越界:防止运行的进程访问其他进程的空间;
(2)防止操作越权:防止不同进程越过对共享内存所规定的访问权限。(读操作执行了写,即越权)
可采用的方法:①设置上下限寄存器;②界地址寄存器、重定位寄存器判断。
4.存储扩充
(书本)内存具有速度快但容量小的特点,外存储器具有容量大但速度慢的特点。存储扩充采用软件手段,取二者之长,避二者之短,将内存空间与外存空间有机地结合在一起,形成一个容量相当于外存储器而速度接近于内存(且对用户透明)的虚拟存储系统。
其他实现内存空间的扩充的技术(即缓解内存空间使用矛盾):
4.1 覆盖技术
覆盖(overlay)是将较大程序装入较小进程空间的技术。
- 只将全局代码和数据静态装入内存【(王道里叫)固定区】,其它部分动态装入(覆盖区)。
- 后装入的成分重复使用先装入成分所使用的存储区,即覆盖先装入的成分。
A放入固定区就不会再移动。B、C不需要同时使用,二者共享覆盖区0,其大小按照较大的C的大小来设置。同理,D、E、F共享覆盖区1,按D的大小设置。这样下来,只需要30k就能使程序运行完成。
但是,程序员需要将程序划分为若干个程序段,并根据访问和调用关系规定它们的执行和覆盖次序(即B、C放入覆盖区0和D、E、F放入覆盖区1的次序),而且需要编写一个覆盖驱动程序(overlay driver),需要一定的编程技巧和经验。
因此,缺点就是对用户不透明,增加用户编程负担,现在很少使用。
虚拟存储管理系统(之后详细阐述)也是用较小的空间运行较大的程序,是由操作系统来完成的,而覆盖技术是由编程人员、应用程序来完成,并不需要操作系统的支持。
4.2 交换技术(swapping)
低级调度——进程调度/CPU调度
高级调度——作业调度
中级调度——内存调度——交换:运行的进程在内存和外存的交换空间进行动态交换。
内存空间紧张时,等待的进程很多,需要将内存中的某些进程调出到外存(挂起),把外存中已具备运行条件的进程调入内存(激活)。
1. 应该在外存的什么位置保存换出的进程?
磁盘存储空间通常分为对换区(较小)和文件区。文件区采用离散分配方式,主要追求存储空间的利用率;而对换区追求换入换出的速度,因此采用连续分配方式。
2. 什么时候应该交换?
许多进程运行且内存并行度很高时,内存空间紧张。
3. 应该换出哪些进程?
可优先换出阻塞进程、优先级低的进程、在内存中驻留≥2秒的进程。(换入的可以是在外存中驻留≥3秒的进程)
注:PCB一直处于内存中,其对应进程调出时,记录了进程在外存中的位置。
4.3 覆盖、交换、虚拟存储的区别
覆盖是在同一个程序或进程中的几个独立的、互不相关的程序段进行相互覆盖。(用户编写)
交换是在不同进程(或作业)之间交换,基本单位是整个进程,因而仍不能运行比系统内存空间大的程序。(操作系统支持)
虚拟内存技术可以继续把将进程在内存中再次分为页或段,以页或段为单位,进程的一部分可换到外存上,即使总进程所需内存大于系统内存也可以运行。
5.地址映射
程序所产生的逻辑地址,需要转换为内存空间的物理地址。而将逻辑地址转换为物理地址的过程称为地址映射(address mapping)。需要将软件和硬件结合起来实现,完成地址映射的硬件机构称为存储管理部件(memory management unit,MMU)
转换方法有三种:
二、内存分区(书本)
1.划分方法
按分区时刻:
- 静态分区:系统运行之前就将内存空间划分为若干区域。
- 动态分区:按照申请分配恰好满足要求的一个或多个区域。
按分区大小:
- 等长分区:若干长度相同的区域,大小一般为 2的 i 次方
- 异长分区:若干长度不同的区域。
在实际系统中的通常做法:
- 静态+等长
- 动态+异长
2.内存分配
2.1 静态等长分区的分配
适用于页式存储管理方式和段式存储管理方式。(见下文)
描述空间状态的数据结构
1️⃣位图
2️⃣空闲页面表
120号开始的4个页都空闲。
3️⃣空闲页面链
内存分配空闲块时直接从Head开始即可,而若申请多个外存块的时候,就需要先将第一块调入内存才能知道下一个空闲块的位置,不断在内存和外存之间转换,速度慢。
2.2 动态异长分区的分配
(见下文——动态分区分配)
三、连续分配管理方式
【书本上应该是对应界地址管理方式,一个进程在内存空间的地址由两个参数决定:进程起始地址(基址寄存器里)和长度(限长寄存器里),称为一个对界,单一连续区管理又称单对界存储管理】
1.单一连续分配(静态分区)
内存中只能有一道用户程序,独占用户空间。
优点:实现简单,可采用覆盖技术扩充内存,不一定需要内存保护,无外部碎片。
缺点:只能用于单用户、单任务的操作系统中;有内部碎片,存储效率极低(整个用户区只有进程A,其他区域空闲,分配了区域但是没有使用)。
2.固定分区分配(静态等长、静态异长)
为能在内存中放入多道程序,将用户空间划分为若干个固定大小的分区,每个分区装入一道作业。
分区大小相等:缺乏灵活性。适合控制多个相同对象的场合。(n个控制程序相等)
分区大小不等:增加灵活性。适合作业大小不等的系统。
优点:实现简单;无外部碎片。
缺点:程序太大,所有分区都不不能满足要求,不得不采用覆盖技术,降低性能来完成;产生内部碎片。
3.动态分区分配(动态异长)
随着多道程序中有的程序运行完,有的程序没有运行完,这就会使整个内存出现一段内存占用,一段内存是空闲,这时,多个空闲区域可能不是连续的。
这就需要数据结构——空闲分区表或空闲分区连来描述,记录所有当前未被进程占用的空闲区域。
针对多个分区都能满足进程需求的情况,如何进行内存分配?
3.1 动态异长分区分配算法
1️⃣最先适应(First Fit,FF)
(王道)首次适应算法
实现:
Ⓐ 所有空闲区域起始地址递增次序依次记录于空闲区域表中;
Ⓑ 进程申请存储空间时,从头部开始查找,取第一个可满足表目。
优点:尽量使用低地址空间,高地址空间保持大空闲区域。
缺点:可能分割大空闲区。
2️⃣最佳适应(Best Fit,BF)
【为克服First Fit算法的缺点而提出】分配时取满足申请要求且长度(容量)最小的空闲区域。
实现:
Ⓐ 所有空闲区域按照长度(容量)递增次序依次记录于空闲区域表中;
Ⓑ 从头查找,取第一个可满足表目。
优点:尽量不分割大的空闲区。
缺点:形成很小以致以后无法利用的空闲区域,称为碎片(外部碎片)。
3️⃣最坏适应(Worst Fit,WF)
【为克服Best Fit算法的缺点而提出】分配时取满足申请要求且长度(容量)最大的空闲区域。
实现:
Ⓐ 所有空闲区域按照长度(容量)递减次序依次记录;
Ⓑ 从头查找,取第一个可满足表目。
优点:避免形成碎片。
缺点:分割大的空闲区域,无法满足较长存储空间的申请要求。
4️⃣下次适应(Next Fit,NF)
(书本)最先适应算法FF总是使用低地址空间,因此存储器易于磨损,为使存储器低区和高区均匀磨损,延长存储器的使用寿命,提出下次适应算法。
(王道)邻近适应(Nest Fit,NF)算法。首次适应每次都从头开始查找,增加查找的开销。
因此,下次适应算法自上次分配空闲区域的下一个位置开始,选取一个可满足的空闲区域。
实现:
Ⓐ 设置一个循环查找指针,每次分配从指针处开始查找;
Ⓑ 分配后将指针调整为下一个区域。
优点:空闲区域分布和分配更均匀,开销较小。
缺点:可能分割大空闲区域。
4.外部碎片与紧凑
上述动态异长分区分配存储可能形成很小的空闲区域,因空间太小无法分配,称为外部碎片,过多会严重造成资源浪费。(已经静态分区后,有分区存在没有利用的空间,称为内部碎片)
【碎片处理】紧凑:移动占用区域,使所有空闲区域连成一片,但往往开销很大。