内存管理
第三章_内存管理
3.1 内存管理的概念
3.1.1 内存的基础知识
3.1.1.1 进程运行的基本原理
本小节思维导图如下图所示:
一个程序 从写到被执行 会经历以下步骤,在计算机组成原理中也有类似的说明:
其中,链接和装入各有三种方式:
链接的三种方式:
装入的三种方式:

3.1.1.2 进程的内存映像
进程的内存映像如图所示:
注意:用户态 / 内核态 是 CPU 的运行状态,是为了解决权限控制问题;而 用户空间 / 内核空间(用户区 / 内核区) 是内存空间的划分,是为了解决地址隔离问题
3.1.1.3 覆盖与交换
本小节思维导图如图所示:
覆盖技术 如图所示:
注意:覆盖技术的单位是 程序模块。
交换技术 如图所示:
注意:交换技术的单位是 整个进程。

覆盖技术:主要用于扩充 单个程序(进程)的逻辑地址空间。 交换技术: 主要用于提高 内存利用率和并发度,不是为了扩充单个进程的逻辑地址空间。
3.1.2 内存管理的基本概念
本小节思维导图如图所示:
注意一下三种装入方式的地址转换分别由谁实现。
需要特别说明一下 存储保护的两种方法,如下图所示:

3.2 内存空间的分配与回收
3.2.1 连续分配管理方式
前面 “内存管理的基本概念” 小节已经说过,内存管理主要就是四个方面,而本小节 “连续分配管理方式” 属于 内存空间的分配与回收。
本小节思维导图如图所示:

3.2.1.1 单一连续分配
单一连续分配如图所示:

3.2.1.2 固定分区分配
固定分区分配如图所示:

3.2.1.3 动态分区分配
与固定分区分配的 区别 在于:固定分区分配的分区是开始就固定好的,而动态分区分配的分区是进程装入时动态确定的。
了解什么是动态分区分配,只需要回答下面三个问题即可:
总结一下:

3.2.1.4 动态分区分配算法
首次适应算法:
最佳适应算法:
注意:每次分配出去一个之后,还要重新排个序。
最坏适应算法:
注意:每次分配出去一个之后,还要重新排个序。
邻近适应算法:
四种算法对比 如下图所示:

3.2.2 非连续分配管理方式
3.2.2.1(1) 基本分页存储管理
本小节思维导图如下图所示:
首先需要知道 什么是分页存储:
对于 页表 这个重要概念,用几个问题来熟悉:
注意:是系统会为 每个进程都建立一张页表(这只是简化的说法,实际中是每个进程建立一套页表),每个 页表项 记录对应页面所驻留的 物理页框号 以及相关信息(有效位、访问位等)。
若页面大小是 2 的整数次幂,会有一个非常良好的特性:
这样逻辑地址的前多少位表示的就全部是页面大小,系统能够使用 “位运算快速拆地址 + 硬件直接分段”,而不用除法。

3.2.2.1(2) 基本地址变化机构
本小节思维导图如图所示:
基本地址变化机构过程 如图所示:
通过一个题目来熟悉考研会怎么考察:
对 页表项的进一步探讨 如图所示:

3.2.2.1(3) 具有快表的地址变换机构
快表 是一个 CPU 里的高速缓冲存储器,是一个单独的 硬件,不是一个高速缓存器中的一部分!
支持快表的地址变换机构,将逻辑地址转变成物理地址的 流程图 如图所示:
通过甘特图来理解考研会如何进行考察:
与 基本地址变换机构对比 如下:

3.2.2.1(4) 两级页表
本小节思维导图如下图所示:
首先我们来看 单页表存在的问题:
于是我们自然而然的想到了用 二级页表 来解决这个问题:
关于 二级页表如何寻址 如下图所示:
继续拓展为 多级存储,需要注意以下细节:

3.2.2.2 基本分段式存储管理
本小节思维导图如下图所示:
基本分段式存储管理概念如下图所示:
分页是对物理内存的划分,而分段是对进程代码的划分。
与分页存储类似,分段存储的地址寻址流程 如图所示:
分段分页管理对比 如下:

3.2.2.3 段页式管理方式
本小节思维导图如下:
我们首先来看下段式管理方式和页式管理方式各自的 优缺点:
不难想到,段式管理方式和页式管理方式是能够结合起来使用的。于是段页式管理方式 应运而生,如下图所示:
关于段页式管理方式的 寻址流程 如下图所示:

3.3 内存空间的扩充
3.3.1 虚拟内存技术
内存管理方式的发展过程:
传统存储管理
├── 连续分配
│ ├── 单一连续
│ ├── 固定分区
│ └── 动态分区
│
└── 离散分配
├── 基本分页
├── 基本分段
└── 基本段页式
(特点:进程运行前必须全部装入内存)
↓ 为解决内存不足
覆盖技术
交换技术
↓ 进一步发展
虚拟内存
├── 请求分页
├── 请求分段
└── 请求段页式
(特点:运行时不必全部装入内存)
本小节 思维导图 如图所示:
传统的内存管理方式具有如下的特征和缺点:
而虚拟存储是基于局部性原理进行实现,具有以下特征:
具体怎么 实现虚拟存储 如下图所示:

3.3.2 请求分页的管理方式
请求分页存储管理与基本分页存储管理的主要区别:
- 在程序执行过程中,当所 访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。
- 若内存空间不够,由操作系统负责 将内存中暂时用不到的信息换出到外存。
本小节思维导图如下图所示:
与基本分页不同,请求分页的管理方式 对页表会做一些结构上的改动:
若是发生缺页,需要 缺页中断机构 来进行处理:
注意:缺页中断属于内中断中的 故障中断。
而关于 请求分页的地址变换,与基本分页的地址变换也是大同小异:
书上也给出了地址变换的具体过程,这个 过程图要求牢记!

3.3.3 页面置换算法
五种页面置换算法的总结与对比如下图所示:

3.3.3.1 最佳置换算法(OPT)

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

3.3.3.3 最近最久未使用算法(LRU)

3.3.3.4 时钟置换算法(Clock)

3.3.3.5 改进型时钟置换算法

3.3.4 页面分配
本小节思维导图如图所示:

3.3.4.1 页面分配的基本概念
首先了解一些页面分配策略的基本概念:
抖动现象:
刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存,这种频繁的页面调度行为称为 抖动,或颠簸。产生抖动的主要原因是进程频繁访问的页面数目高于可用的物理块数(分配给进程的物理块不够)。
为进程分配的物理块 太少,会使进程发生抖动现象。为进程分配的物理块 太多,又会降低系统整体的并发度,降低某些资源的利用率。
为了研究为应该为每个进程分配多少个物理块,Denning 提出了进程 “工作集” 的概念。
3.3.4.2 内存分配策略
在请求分页系统中,可采取两种内存分配策略,即固定和可变分配策略。在进行置换时,也可采取两种策略,即全局和局部置换。于是可以组合出一下三种适用的策略:
其中可变分配全局置换和可变分配局部置换区别如下:
注意:可变分配局部置换策略中进程的内存块增加是系统分配的 空闲内存块,而可变分配全局置换中进程的内存块增加是系统分配的可能 从别的进程“抢来”的内存块 或者 空闲的内存块。

3.3.4.3 何时调入页面

3.3.4.4 何处调入页面

3.3.5 页框回收
本小节思维导图如图所示:
普通的页框回收 如图所示:
为了使页框回收更加有效率,出现了 缓冲式回收 的方法:

3.3.6 内存映射文件
内存映射文件是操作系统向应用程序提供的一种系统调用机制,它在 磁盘文件与进程的虚拟地址空间之间建立直接的映射关系,与虚拟内存机制紧密相关。
传统的文件访问方式 如图所示:
采用 内存映射文件的文件访问方式 如图所示:
传统文件访问 是通过 read/write 将文件内容复制到用户缓冲区后访问;而 内存映射文件 并不会立即把整个文件读入内存,而是在虚拟地址空间中建立 “文件页→虚拟页”的映射关系。当程序访问某个映射页时,若该页尚未在内存中,则触发缺页异常,由操作系统将对应文件页调入页框,因此具有 按需加载 的特点。