本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对
操作系统
知识点的理解的总结。希望对新一届的计算机考研人提供帮助!!!
关于对内存管理
章节知识点总结的十分全面,涵括了《操作系统》课程里的全部要点(本人来来回回过了三遍视频),其中还陆陆续续补充了许多内容,所以读者可以相信本篇博客对于考研操作系统 “内存管理” 章节知识点的正确性与全面性;
但如果还有自主命题的学校,还需额外读者自行再观看对应学校的自主命题材料。
操作系统
笔记导航
- 第一章 计算机概述
- 第二章 进程与线程
- 第三章 内存管理
⇦当前位置
- 第四章 文件管理
- 第五章 输入输出管理
操作系统 复试精简笔记 (未完成)
- 408 全套初复试笔记汇总 传送门
如果本篇文章对大家起到帮助的话,跪求各位帅哥美女们,
求赞 、求收藏 、求关注!
你必考上研究生!
我说的,耶稣来了也拦不住!
食用说明书:
第一遍学习王道课程时,我的笔记只有标题和截图,后来复习发现看只看图片,并不能很快的了解截图中要重点表达的知识点。
在第二遍复习中,我给每一张截图中 标记了重点,以及 每张图片上方总结了该图片 对应的知识点 以及自己的 思考 。
最后第三遍,查漏补缺。
所以 ,我把目录放在博客的前面,就是希望读者可以结合目录结构去更好的学习知识点,之后冲刺复习阶段脑海里可以浮现出该知识结构,做到对每一个知识点熟稔于心!
请读者放心!目录展示的知识点结构是十分合理的,可以放心使用该结构去记忆学习!
注意(⊙o⊙)!,每张图片上面的文字,都是该图对应的知识点总结,方便读者更快理解图片内容。
【考纲内容】
王道 P177 ~ 248
(一) 内存管理基础 网课耗时:
3.5 h
- 内存管理概念 :逻辑地址与物理地址空间,地址交换,内存共享,内存保护,内存分配与回收;
- 连续分配管理方式 :页式管理;段式管理;段页式管理;
(二) 虚拟内存管理
网课耗时:
1.5 h
- 虚拟内存基本概念;
- 请求页式管理;
- 页框分配;
- 页置换算法;
- 内存映射文件;
- 虚拟存储器性能的影响因素及改进方式;
【复习提示】
内存管理 和 进程管理 是操作系统的 核心 ;
本章围绕 分页机制 展开:
通过 分页管理方式 在物理内存大小的基础上提高内存的利用率,
再进一步引入 请求分页管理方式 ,实现虚拟内存,使内存脱离物理大小的限制,从而提高处理器的利用率;
1. 什么是内存 ?
【补充】机械字 是硬件(物理)单元,存储单元 是逻辑单元,内存可以看成一个个存储单元组成;
内存的一大作用是 缓和CPU与硬盘之间的速度矛盾 ;
补充知识:常用的数量单位:
- 210 = 1K
- 220 = 1M
- 230 = 1G
2. 进程运行的基本原理
创建进程首先要将程序和数据装入内存; 将 用户源程序 变为 可在内存中执行的程序 ,通常需要以下几个步骤:
- 编译:由 编译程序 将 用户源代码 编译成 若干个模块(机器指令);
- 链接:由 链接程序 将 编译后形成的一组 目标模块 及 它们所需的 库函数 链接在一起,形成一个完整的 装入模块;
- 装入:由 装入程序 将 装入模块 装入内存运行;
(1) 逻辑地址 与 物理地址
指令的工作原理是基于 地址 进行的,而 每个地址对应一个数据的存储单元 ;
编译后,每个目标模块都从0号单元开始编址,这称为该目标的 相对地址(或逻辑地址)
当链接程序将各个模块链接成一个完整的可执行目标程序时,链接程序按顺序依次按各个模块的相对地址构成一个统一的从0号单元开始编址的 逻辑地址空间(或虚拟地址空间)
对于32位系统,逻辑地址空间的范围为 0 ~ 232 - 1
不同进程可以有相同的逻辑地址,因为这些相同的逻辑地址可以映射到主存的不同位置;
物理地址空间 是指内存中物理单元的集合,它是 地址转换 的最终地址;
进程在运行时执行指令和访问数据,最后都要通过物理地址从主存中存取;
当 装入程序 将可执行代码装入内存时,必须通过地址转换将逻辑地址转为物理地址,这个过程称为 地址重定位 ;
有三种装入方式,也就是三种重定位方式,用来解决指令中的逻辑地址到物理地址的转换(后面再补充)
(2) 链接的三种方式
① 静态链接
② 装入时动态链接
③ 运行时动态链接
(3) 装入的三种方式
① 绝对装入
② 可重定位装入(静态重定位)
③ 动态运行时装入
小结
1、从逻辑方面认识 内存和内存结构 ;
2、==进程运行的基本原理:==指令工作原理 + 逻辑地址与物理地址 + 编译、链接、装入;
王道课本在介绍 ==内存管理的主要功能,==有5个方面,课程只介绍了4个,少了 内存共享 ;
本节只是让你初步认识 内存管理功能 的 基本概念 ,后续章节会展开介绍;
1. 内存空间的分配与回收
具体负责:如何分配 ?如何回收 ?哪些分配了哪些还空闲 ?
2. 内存空间的扩充
3. 地址转换
逻辑地址 转换为 物理地址,也就是 地址重定位 ,涉及到之前介绍的 三种装入方式 ;
4. 存储保护
已经各个分配的内存空间互不影响,也就是说 确保各进程不会为了内存 打架 ;
内存保护的两种方法
方法一:设置一对上、下限寄存器,明确进程指令所能访问的 地址范围 ;
内存保护的两种方法
方法二:重定位寄存器 + 界地址寄存器。思想不变,本质还是确定进程指令所能访问的 地址范围 ;
小结
本节就是介绍 内存管理主要功能 的 基本概念 ;
覆盖 与 交换 是在多道程序运行环境下用来 扩充内存 的两种方法;
1. 覆盖技术
覆盖:分段思想 + 一个固定区 + 若干个覆盖区;
2. 交换技术
内存调度 就是通过 交换技术 实现的;
文件区 - 离散分配方式;
对换区 - 连续分配方式;
小结
下图总结的很充分,看下图复习即可;
==连续分配方式:==为一个用户程序分配一个 连续的内存空间 ;
1. 单一连续分配
2. 固定分区分配
内存分区,每个分区装入一道作业;
3. 动态分区分配
问题1:操作系统要使用什么样的数据结构记录内存的使用情况 ?
问题2:当有很多空闲分区满足需求,该选择哪一个分区呢 ?
问题3:如何进行分区的分配与回收 ?
分配时可能遇到的情况:
- 分配的空间有剩余;
- 分配的空间刚刚好;
回收时可能遇到的情况:
情况一
情况二
情况三
情况四
内部碎片 和 外部碎片
4. 动态分区分配算法
① 首先适应算法(First Fit)
首次适应算法最简单,但会使得内存的 低地址部分 出现很多小的空闲分区,并且每次分配查找都要经过这些分区,增加开销;
② 最佳适应算法
③ 最坏适应算法
④ 邻进适应算法
小结
1、单一连续分配 (单一分区分配);
2、固定分区分配;
3、动态分区分配 - 动态分区分配算法;
要理解好 分区 的意义,就是一道作业对应一个分区;
固定分区会产生 ==内部碎片,==动态分区会产生 ==外部碎片,==这两种技术对内存的利用率都比较低;
为了尽量避免碎片的产生,就引入了 分页 的思想;
1. 分页存储的基本概念
(1) 回顾:地址空间
(2) 分页存储
① 分页思想
把主存空间划分成大小相等且固定的块,作为主存的基本单位;
每个进程也以块为单位进行划分,进程在执行时,以块为单位逐个申请主存中的块空间;
分页很像分区相等的固定分区技术,所以 分页管理也不会产生外部碎片 ;
区别:块的大小相对于分区来说要小很多,而且进程也按照块进行划分,进程运行时按块申请主存可用空间并执行;
进程只会在为最后一个不完整的的块申请一个主存块空间时,产生主存碎片==(页内碎片)==
② 页面和页面大小
进程中的块称为 ==页 或 页面,==内存中的块称为 ==页框 或 页帧,==外存直接称为 块 或 盘块;(注意和 存储单元 做区分)
页 和 页框 是逻辑划分,块 是物理划分;
进程在执行时申请主存空间,就是为 每个页面 分配主存中的 ==可用页框,==这就是 页 和 页框 的一一对应;
③ 页表
页表的作用:实现从页号到物理块号的地址映射;
注意很关键的一点,进程分成n块,页表对应n个页表项;
关于 页表 的两个问题,下面依次解答
【问题】
每个页表项占多少字节 ?
页表项中的 页号 可以 ==隐含,==即 页号不占用存储空间 ;
例如:==arr[1] = 101;==用页表项的角度来看,就是 1号页 对应的块号 是101;
每个页表项占 3B,存储整个页表至少需要
3 × (n + 1) B
(n取决进程可分为多少页)
【问题】
如何实现地址的转换 ?
答:起始位置 + 偏移量(连续存放)
分页存储,逻辑地址A对应的物理地址 = P号页面在内存中的 起始地址 + 页面偏移量W
下面是一些关于分页的计算问题
【问题】
如何确定一个逻辑地址对应的页号、页内偏移量 ?
下图用32位的逻辑地址,页面大小为 212B
前20位表示页号,后12位表示页内偏移量;
【问题】
为何页面大小要取2的整数幂 ?
(4) 逻辑地址结构
逻辑地址 = 页号 + 页内偏移量
页内偏移量的位数K 表示 页的大小为 2K ;
页号的位数M 表示 共有 2M 个页面;
小结
1、分页的基本概念;
2、页表。进程大小 决定 页表项数量,内存大小 决定 页表项长度;
3、逻辑地址结构。进程大小 决定 页号 P,内存块大小 决定 页内偏移量 W;
4、如何借助页表实现地址转换;
2. 基本地址变化机构 ⭐
地址变换机构 是用于实现地址转换的 一组硬件机构 ;
① 根据逻辑地址求 页号 和 页内偏移量;
② 比较 页号P 和 ==页表长度M,==是否 页号越界(M表示有M个页表项);
③ 根据 页表寄存器 的信息,找到页表,查询页号对应的 内存块号;
④ 计算出物理地址
E = b × L + W
; ⑤ 用得到的物理地址E访存;
用文字再复习下上图地址变换的过程
我们计算,是使用
b × L + M
计算出物理地址; 但如果把内存块号、页内偏移量用二进制拼接起来,得到的物理地址是相同的;
例题,尝试计算一下
关于 页表项 的计算问题,如下图所示:
存储页表时,若采用 3个字节 时,页框会剩余1B的,其它页表项被迫存储在下一个页框里;
但进程页表通常是 连续存储 的;
针对这个问题,虽然 3字节 已经可以表示内存块号范围,但为了不产生页内碎片,所以采用 4字节 的页表项;
注意进程页表是装在 连续的内存块中 ;
小结
下图三部分总结的很好,注意标红部分;
3. 具有快表的地址变换机构
① 什么是快表 ?
快表不是内存,是一种高速缓存,但和狭义上的Cache还是有区别的;
【问题】
能否把整个页表都放在TLB中 ?
答:太贵了;所以应该选择合适的 页面置换算法 更实惠,选择把 最有用的页表项 放进快表里;
② 引入快表后,地址的变换过程
注意!快表是一个硬件,但进程切换时,快表内容会被清空,所以每次初始的时候,快表里是空的;
页表是根据进程存在的,而快表是独立于进程的;
③ 局部性原理
小结
4. 两级页表
(1). 单级页表存在的问题 ?如何解决 ?
单级页表存在的第一个问题:
下图的情况,需要专门给进程分配 1024个连续的页框 来存放它的页表;
不仅需要占用较大的连续空间,而且也丧失了 离散分配 的优点;
单级页表存在的第二个问题:根据局部性原理,没必要把整个页表常驻内存,因为进程只会访问部分页面;
总结下单级页表需要解决的两个问题
这里先简单提一下 虚拟存储技术 ;
给每个页表项增加一个 标志位,用来记录是否在内存中;
(2). 两级页表的原理、地址结构
(3). 如何实现地址变换 ?
(4). 两级页表需要注意的几个细节
小结
下图总结的很好,看下图即可;
章节小结
1、分页存储的基本概念;
2、地址变换机构;
3、快表;
4、两级页表;
1. 分段
按照程序 自身逻辑关系 划分为 ==若干个段,==每段从0开始编制;
程序员用段名来编程,编译程负责序会把段名转换为段号;
2. 段表
段号也可以 隐含 段号;
因为各段的长度不一,所以段表里添加了记录段长的字段;
3. 如何实现地址变换
4. 分段、分页管理的对比
小结
1、分段的基本概念;
2、段表;
3、地址变换;
4、分段 vs. 分页
还没看视频,等复习完分页、分段,再来看
1. 分页、分段的优缺点分析
2. 分段 + 分页 = 段页式管理
进程按 逻辑分段,各段按物理分页;
3. 段表、页表
4. 如何实现地址变换
小结
1、分页、分段的优缺点;
2、段页式存储的基本概念;
3、页表、段表结构;
4、地址变换;
虚拟内存是基于高速缓存技术,提出的一种内存管理方案;
1. 传统存储管理方式的特征、缺点
- 一次性
- 驻留性
2. 局部性原理
传统存储管理就是想可以最大程度地压榨内存资源,不管有没有用,占住内存空间最重要;
虚拟存储技术,就是让最关键的哪个作业运行,其它不是很关键的作业先不管,就让人觉得内存好像很大;
根据什么策略选择呢?局部性原理
- 时间局部性;
- 空间局部性;
3. 虚拟内存的定义和特征
虚拟内存的思想:部分装入 + 请求调入 + 置换功能(对用户透明)–> 虚拟大内存
虚拟内存的特征:
- 多次性
- 对换性
- 虚拟性
4. 如何实现虚拟内存技术
【补充】虚拟内存的实现需要一定的硬件支持:
- 一定容量的 内存 和 外存 ;
- 页表机制(或段表机制),作为主要的数据结构;
- ==中断机构,==当用户程序要访问的部分尚未调入内存时,则会产生中断;
- ==地址变换机构,==逻辑机构到物理地址的变换;
虚拟内存的实现(三种方式)
- 请求分页存储管理
- 请求分段存储管理
- 请求段页式存储管理
小结
1、传统存储管理方式的特征、缺点;
2、局部性原理;
3、虚拟内存的定义和特征;
4、==如何实现虚拟技术:==部分装入 + 请求调入 + 置换功能(请求分页存储管理);
程序进内存时,基本分页的一次性 与 请求分页的多次性 ,两者的不同导致后续程序运行过程中也有区别;
由于多次性,导致请求分页还需要 请求调页 和 页面置换 两者功能;
1. 页表机制
基本分页页表 vs. 请求分页页表
2. 缺页中断机构
3. 地址变换机构
注意 请求分页 存储管理 与 基本分页 存储管理 的区别;
如果在快表中找到某个页面对应的页表项,那么这个页面一定是在内存中的;
若这个页面被换出外存,则快表中的相应表项也要删除,否则可能访问错误的页面;
重点留意王道 图 3-24 请求分页的地址变换过程
小结
1、页表机制;
2、缺页中断机构;
3、地址变换机构;
1. 最佳置换算法
OPT:选择剩余价值最低的;
OPT 算法只能是理想算法,因为无法提前知道未来要被调用的页面;
2. 先进先出置换算法
为进程分配 四个内存块时,缺页不减反增 - Belady 异常
3. 最近最久未使用置换算法
LRU:淘汰老页面
LRU 算法性能好,但是需要专门硬件,实现困难;
4. 时钟置换算法
5. 改进型的时钟置换算法
改进思想:当页面未被修改过,可以直接抛弃,无需写回外存;
小结
1. 驻留集
2. 页面分配、置换策略
- 固定分配局部置换
- 可变分配全局置换
- 可变分配局部置换
3. 调入页面的时机
4. 从何处调页
5. 抖动(颠簸)现象
6. 工作集
小结
下图总结的很好,直接看下图小结;
1. 内存映射文件
本质就是操作系统向上层程序员提供的一个功能,作用:
- 方便程序员访问文件数据;
- 方便多个进程共享同一个文件;
2. 传统的文件访问方式
3. 内存映射文件的原理和作用
① 方便程序员访问文件数据;
传统文件访问方式,文件其实是离散地分布在磁盘里;
采用内存映射文件方式,会让你感觉要访问的文件是连续的存储;
当我们要读入第2块数据时,但此时还没有数据,就会有一个缺页异常,操作系统就会去把对应的数据调入内存;
也就是说,程序员再也不用考虑 read操作 了,读入数据的过程由操作系统替我们完成;
② 方便多个进程共享同一个文件
小结
分页管理方式和分段管理方式在很多地方是相似的,比如在内存中都是不连续的、都有地址变换机构来进行地址映射等。
但两者也存在许多区别,如下:
分页 | 分段 | |
---|---|---|
目的 | 分页仅是系统管理上的需要,是为实现离散分配方式,以提高内存的利用率。而不是用户的需要; | 段是信息的逻辑单位,它含有一组意义相对完整的信息。分段的目的是能更好地满足用户的需要; |
长度 | 页的大小固定且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的; | 段的长度不固定,决定于用户所编写的程序,通常由编译程序在编译时根据信息的性质来划分; |
地址空间 | 分页的程序地址空间是一维的,即单一的线性地址空间,程序员利用一个记忆符即可表示一个地址; | 分段的程序地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址; |
碎片 | 有内部碎片,无外部碎片; | 有外部碎片,无内部碎片; |
1)为什么要进行内存管理 ?
在单道系统阶段,一个系统在一个时间段内只执行一个程序,内存的分配极其简单,即仅分配给当前运行的进程;
引入多道程序后,进程之间共享的不仅仅是处理机,还有主存储器。然而,共享主存会形成一些特殊的挑战;
若不对内存进行管理,则容易导致内存数据的混乱,以至于影响进程的并发执行;
因此,为了更好地支持多道程序并发执行,必须进行内存管理;
2)页式管理中每个页表项大小的下限如何决定 ?
页表项的作用是找到该页在内存中的位置;
以32位逻辑地址空间、字节编址单位、一页4KB为例,
地址空间内共含有 232 B / 4KB = 1M 页,需要 log21 M = 20 位才能保证表示范围能容纳所有页面;
又因为以字节作为编址单位,即 页表项的大小 ≥ ⌈20 / 8⌉ = 3B ;
当然,也可选择更大的页表项大小,让一个页面能够正好容下整数个页表项,以方便存储
(例如取成4B,一页正好可以装下1K个页表项),或增加一些其他信息。
3)多级页表解决了什么问题 ?又会带来什么问题 ?
多级页表解决了当逻辑地址空间过大时,页表的长度会大大增加的问题;
而采用多级页表时,一次访盘需要多次访问内存甚至磁盘,会大大增加一次访存的时间;
无论是段式管理、页式管理还是段页式管理,读者都只需要掌握下面3个关键问题:
- ① 逻辑地址结构
- ② 表项结构
- ③ 寻址过程
搞清楚这三个问题,就相当于搞清楚了上面几种存储管理方式。再次提醒读者区分逻辑地址结构和表项结构;
1)为什么要引入虚拟内存 ?
上一节提到过,多道程序并发执行不仅使进程之间共享了处理器,而且同时共享了主存;
然而,随着对处理器需求的增长,进程的执行速度会以某种合理平滑的方式慢下来;
但是,若同时运行的进程太多,则需要很多的内存,当一个程序没有内存空间可用时,那么它甚至无法运行;
所以,在物理上扩展内存相对有限的条件下,应尝试以一些其他可行的方式在逻辑上扩充内存。
2)虚拟内存空间的大小由什么因素决定 ?
虚存的容量要满足以下两个条件:
- ① 虚存的实际容量 ≤ 内存容量和外存容量之和,这是硬件的硬性条件规定的,若虚存的实际容量超过了这个容量,则没有相应的空间来供虚存使用;
- ② 虚存的最大容量 ≤ 计算机的地址位数能容纳的最大容量;
假设地址是 32 位的,按字节编址,一个地址代表 1B 存储空间,则 虚存的最大容量 ≤ 4GB (232 B);
这是因为若虚存的最大容量超过 4GB,则 32 位的地址将无法访问全部虚存,也就是说 4GB 以后的空间被浪费了,相当于没有一样,没有任何意义; 实际虚存的容量是取条件①和②的交集,即两个条件都要满足,仅满足一个条件是不行的。
3)虚拟内存是怎么解决问题的 ?会带来什么问题 ?
虚拟内存使用外存上的空间来扩充内存空间;
通过一定的换入/换出,使得整个系统在逻辑上能够使用一个远远超出其物理内存大小的内存容量;
因为虚拟内存技术调换页面时需要访问外存,会导致平均访存时间增加,若使用了不合适的替换算法,则会大大降低系统性能。
本节学习了4种页面置换算法,要把它们与处理机调度算法区分开;
当然,这些调度算法之间也是有联系的,它们都有一个共同点,即通过一定的准则决定资源的分配对象;
在处理机调度算法中这些准则比较多,有优先级、响应比、时间片等,而在页面调度算法中就比较简单,即是否被用到过或近段时间内是否经常使用;
在操作系统中,几乎每类资源都会有相关的调度算法,读者通过将这些调度算法作为线索,可把整个操作系统的课程连成一个整体。