操作系统(三)—— 内存管理

三、内存管理

1. 内存管理的概念

1)内存的基础知识

​ ① 内存:用于存放数据的硬件。程序执行前先放到内存中才会被CPU处理。

​ ② 程序运行过程:编译 —— 链接 —— 装入 --- CPU处理

​ a. 编译:将高级编程语言转换为机器语言。

​ b. 链接:给程序命令分配逻辑地址。

​ c. 装入:将程序命令加载到内存中,分配物理地址。

​ ③ 链接的三种方式

​ a. 静态链接

​ b. 装入时动态链接

​ c. 运行时动态链接

​ ④ 装入的三种方式

​ a. 绝对装入:编译时,生成绝对地址;只适用于单道程序环境。

​ b. 静态重定位(可重定位装入):编译链接都是从0开始,装入时将逻辑地址转变为物理地址。这种方式装入时必须分配全部地址,内存不够就不能装入,运行期间不能再移动。

​ c. 动态重定位(动态运行时装入):编译链接都是从0开始,装入时也按照逻辑地址装入,真正执行时,才转换为物理地址。这种方式需要一个重定位寄存器的支持。现代操作系统几乎都采用这种方式,优点:允许程序在内存中发生移动;可以将程序分配到不连续的存储区;动态分配内存;便于程序段的共享。内存的基础知识

2)内存管理的概念框架

内存管理的概念和框架

3)内存空间的扩充——覆盖与交换

​ ① 覆盖技术 — 解决程序大小超过物理内存总和的问题

​ a. 原理:将程序分为多个段(模块),一个固定区和若干覆盖区

​ b. 缺点:对用户不透明。程序结果必须由程序员声明覆盖结构

​ ② 交换技术

​ a. 原理:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存( 进程在内存和磁盘间动态调度)

​ b. 磁盘分为文件区和对换区,换出的进程在对换区

​ 【区别】覆盖是在同一个程序或进程中的,而交换是在不同进程(或作业)之间的

4)连续分配管理方式

① 三种方式:

​ 1 单一连续分配

​ a. 原理:系统分为系统区和用户区,系统区存放操作系统相关数据,用户区存放用户进程相关数据,内存中只能有一道用户程序,用户程序独占整个用户区。

​ b. 优点:实现简单;无外部碎片,可以采用覆盖技术扩充;可以不需要内存保护

​ c. 缺点:只适用于单用户、单任务的操作系统;有内部碎片;存储器利用率极低。

​ 2 固定分区分配

​ a. 原理:将用户空间分为若干个固定大小(可以不相等)的分区,每个分区可以装入一道作业,互不干扰。需要建立一个分区说明表

​ b. 优点:实现简单,无外部碎片

​ c. 缺点:如果用户程序太大,装不下,只能采用覆盖技术来解决,降低性能;可能产生内部碎片,内存利用率低;

​ 3 动态分区分配

​ a. 原理:在进程装入内存时,根据进程的大小动态建立分区。

​ i. 系统用空闲分区表或空闲分区链来记录内存的使用情况

​ ii. 动态分区分配算法

​ iii. 空闲分区表 怎么分配和回收空间

​ b. 优点:没有内部碎片;

​ c. 缺点:有外部碎片;

② 动态分区分配算法

​ a. 首次适应算法:每次从低地址开始查找,找到第一个能满足大小的空闲分区。空闲分区按照地址递增排序。

​ b. 最佳适应算法:优先使用最小满足大小的空闲分区。空闲分区按照容量递增排序。(会产生很多外部碎片)

​ c. 最坏适应算法:每次从低地址开始查找,找到最大的空闲分区。空闲分区按照容量递减排序。

​ d. 邻近适应算法(又叫循环首次适应算法):在首次适应的基础上,不再从投开始查找,而是从上次查找结束的位置开始查找

5)非连续分页管理方式

① 基本分页存储管理

​ a. 原理:把内存分为大小相等的小分区(页框),把进程也分为与页框大小相等的小块(页或页面)。操作系统需要为每个进程建立一个页表。

b. 过程:

i. 计算出逻辑地址对应的页号

ii. 找到对应页面在内存中的存放位置(不加快表就直接去内存找,有快表就先从快表中查询,没找到再去内存中查询)

iii. 计算出逻辑地址对应的页内偏移量

iv. 物理地址 = 页面地址 + 页内偏移量

分页管理寻址过程

​ c. 基本地址变换机构

​ i. 作用:基本地址变换机构可以借助进程的页表将逻辑地址转换为物理地址基本地址变换机构

​ d. 具有快表的地址变换机构

​ i. 局部性原理:

​ 时间局部性

​ 空间局部性

​ ii. 什么是快表(TLB):访问速度比内存快很多的高速缓冲存储器,用于存放当前访问的若干页表项目,加快地址变换。

​ iii. 引入快表后,地址的变换过程:多了一个从快表中获取的过程,没命中再去内存中的页表查询。

引入快表后寻址过程

​ e. 多级页表

​ i. 目的:页表必须连续存放,因此当页表很大时,需要占用很多连续的页框,分页存储就失去了意义,故推出了多级页表。多级页表

​ f. 【注】

​ i. 页表是一个一维表:页表号 —— 物理地址

​ ii. 不引入快表:两次访存;引入快表:一次访存。

② 基本分段存储管理

​ a. 原理:根据程序自身的逻辑关系划分为若干个段(类似于方法,不同的方法不同的段),每一段都有一个段名,每段从0开始编址。内存中以段为单位分配,每个段连续空间,但各段之间可以不相邻。

​ b. 访问过程段式存储寻址过程

段式存储的原理

​ c. 【注】

​ i. 段表是一个二维表:段号 —— 段长 + 段的起始地址(基址)

​ ii. 不引入快表:两次访存;引入快表:一次访存。

​ d. 分段和分页的对比页式存储VS段式存储

③ 段页式存储管理

​ a. 分页分段的优缺点

段页式优缺点

​ b. 原理:先分段,再把每段分页,这样就避免了两者的缺点。

​ c. 与单独的段表、页表的区别:段表存放的地址不同,单独的段表存放的是物理地址的长度和起始位置,而这里是存放的页表长度和页表存放地址;页表是一样的。

​ d. 地址变换过程段页式寻址过程

​ 【注】不引入快表:三次访存;引入快表:一次访存。

2. 虚拟内存管理

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

​ 一次性:作业必须一次性全部装入内存。导致大作业不能运行;作业太多也不能运行,多道程序并发度下降。

​ 驻留性:一但作业装入内存,会一直驻留在内存中,用不上的也会驻留,浪费资源。

2)局部性原理

① 时间局部性

​ 如果执行了程序中的某条指令,那么不久后这条指令很可能再次执行,数据也是,访问了,后面也可能大量访问(循环)。

② 空间局部性

​ 一但程序访问了某个存储单元,那么不久后,其附近的存储单元也可能被访问(因为很多数据都是连续存储,指令也是顺序存放的。

3)虚拟内存的定义和特征

​ ① 定义

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

​ ② 特征

​ a. 多次性:无需在作业开始前一次性全部装入内存

​ b. 对换性:作业运行时无需一直常驻

​ c. 虚拟性:从逻辑上扩充了内存的容量,看起来好像远大于实际容量,物理上不变

4)如何实现虚拟内存技术

​ ① 建立在离散分配的内存管理方式基础上

​ ② 实现方式

​ a. 请求分页存储管理

​ b. 请求分段存储管理

​ c. 请求段页式存储管理

5)请求分页管理方式

​ ① 与 基本分页存储管理 的区别

​ 执行过程中,所访问的信息不在内存中,由操作系统负责从外存中调入内存;如果内存不足,由操作系统负责将暂时不用的置换出去。

​ ② 页表机制

​ 请求页表,相比于基本页表,增加了 状态位、访问字段、修改位、外存地址

​ ③ 缺页中断机构

​ a. 当访问的页面不再内存时,会产生一个缺页中断,然后由操作系统的缺页中断处理程序处理中断。此时缺页的进程阻塞,调页完成后,再将其唤醒。

​ b. 当内存中有空闲时,分配一个空闲块,将所缺页面装入,并修改也表中相应的页表项。如果没有空闲块,则由页面置换算法选择一个淘汰,若被淘汰的页面在存储期间被修改过,则将其写回外存,没改就不写。

​ 【注】缺页中断是因为当前执行的指令想要访问的目标页面未调入内存而产生的,故属于 内中断(信号来源于CPU内部)

​ ④ 地址变换机构

6)页面置换算法

① 最佳置换算法(OPT)

​ a. 原理:淘汰的页面将是以后永不使用或者在最长时间内不再被访问的页面。

​ b. 缺陷:不能实现,因为不知道哪一个页面是未来最长时间内不再被使用

② 先进先出置换算法(FIFO)

​ a. 原理:淘汰的页面是最早进入内存的页面

​ b. 缺陷:与进程实际运行时的规律不适应,因为进程中有的页面先进去但是经常被使用,性能差。

​ 【Belady异常】当为进程分配的物理快增大时,缺页次数不减反增的现象(只有FIFO会出现)

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

​ a. 原理:淘汰最近最久未使用的页面。用页表中的访问字段记录该页面自上次被访问以来经历的时间t,用于判断是否要淘汰。

​ b. 缺陷:虽然性能好,但是实现困难,需要硬件支持,开销大

④ 时钟置换算法(CLOCK、最近未使用算法、BRU)

​ a. 原理:用页表中的访问位记录是否被访问过,再将页面都通过链表指针链接成一个循环队列,执行页面置换的时候,遍历链表,如果访问位为0,则置换,如果为1,则标记为0,最多循环完一轮,肯定找到一个位置用于置换。

⑤ 改进型的时钟置换算法

​ a. 原理:在时钟置换算法的基础上,增加一个修改位,优先置换近期未被访问过且未被修改过的页面。

​ i. 第一轮:找(0, 0)且不修改任何标志位,找不到再找第二轮; (淘汰最近没访问且没修改)

​ ii. 第二轮:找(0,1),找的过程中将访问位置为0,找不到再第三轮。(淘汰最近没访问但修改过)

​ iii. 第三轮:找(0, 0)且不修改任何标志位,找不到再找第四轮; (淘汰最近访问过但没修改)

​ iiii. 第四轮:找(0, 1)。因为第二轮已经将访问位全部置为0了,这是找(0, 1)肯定能找到。(淘汰访问过也修改过的)

⑥ 总结比较

五种页面置换算法比较

7)页面分配策略

① 驻留集大小

​ a. 驻留集:请求分页存储管理方式中,给进程分配的物理块集合。一般驻留集大小小于进程的总大小。

​ b. 固定分配局部置换:一开始分配好物理块,页面置换时也只换当前进程自己的。

​ c. 可变分配全局置换:运行中可以更改驻留集大小,缺页时给分配一个新的,没有新的就发生页面置换,置换可以换任何未锁定的。

​ d. 可变分配局部置换:运行中可以更改驻留集大小,缺页时优先页面置换,只能换当前进程自己的,频繁换的话就多分配几个新的。

② 调入页面的时机

​ a. 预调页策略:预测 -> 调入 (运行前)

​ b. 请求调页策略:运行时发现缺页时才调入。(运行时)

③ 从何处调入页面

​ a. 对换区空间足够:页面调入调出都是内存与对换区之间进行。(在进程运行前会将相关数据从文件去复制到对换区)

​ b. 对换区空间不足:凡是不会被修改的数据之间从文件区调入,其他还是在内存和对换区之间进行。

​ c. UNIX方式:运行前进程的相关数据全部在文件区,使用时从文件区调入,不用了调出到对换区,下次再用就从对换区调入。

④ 抖动(颠簸)

​ a. 现象:刚刚换入内存的又要换出,刚刚换出的又要换入。

​ b. 原因:进程频繁访问的页面数目高于可用的物理块数(物理块不够)

⑤ 工作集

​ 某段时间间隔里,进程实际访问页面的集合。

​ 一般来说驻留集大小不能小于工作集合,否则可能发生抖动。

posted @ 2022-05-17 17:41  浪漫主义程序员  阅读(460)  评论(0编辑  收藏  举报