目录
三、第三章——内存管理
1、内存的基础知识
(1.1)程序装入(三种)——绝对装入
(1.2)程序装入(三种)——可重定位装入
(1.3)程序装入(三种)——动态重定位
(2)程序——exe的由来
(3)程序——链接方法
(4)总结
2、内存管理的概念
(1)内存空间的分配和回收
(2)内存空间的拓展(比如:虚拟内存等)
(3)地址转换(逻辑地址-物理地址)
(4)内存保护
3、内存——覆盖与交换
(1)覆盖技术(已经out了)
(2)交换技术
(3)交换技术——对应的问题
(4)总结(考选择题)
4、连续分配管理方式
(1)单一连续分配
(2)固定分区分配
(3)动态分区分配
(4)总结
5、动态分区分配——算法(详细讲解)
(1)首次适应算法(第一次)
(2)最佳适应算法(从小到大)
(3)最坏适应算法(从大到小)
(4)临近适应算法(从大到小)
(5)总结(优缺点)
6、基本分页存储——概念
(1)页框——物理块——内存块——物理页面
(2)逻辑地址-结构【页号+页内偏移量】
(3)总结——概念
(4)重点——地址变换过程(五步)
(5)重点——例题
(6)重点——页表(如何存储在内存中)
(7)总结——地址变换
7、快表(TLB)
(1)查询过程——1(先快表,再慢表,最后内存)
(2)查询过程——2(同时查找-快表-慢表)
(3)局部性原理
(4)总结 (TLB和高速缓存有区别!!!)
8、两级页表(开始套娃啦)
(1)从一级—二级—偏移量(转到物理地址)
(2)单级页表
(3)细节重点
(4)总结
9、段页式管理方式
(1)段表
(2)查询段表——顺序
(3)分段 & 分页 【对比】
(4)总结
10、虚拟内存
(1)传统存储管理方式——特征、缺点
(2)虚拟内存——定义、特征
(3)如何实现——虚拟内存
(4)总结
11、请求页面——管理方式
(1)缺页中断(内中断)
(2)地址变换
(3)总结
12、页面置换算法
(1)最佳置换算法(无法实现)
(2)先进先出算法(绝对公平——Belady异常)
(3)最近最久未使用置换算法(LRU)
(4)时钟页面置换算法(CLOCK & NRU)
(5)时钟页面置换算法——改进型
(6)总结(要会手推——页面替换)
12、页面分配策略、抖动、工作集
(1)工作集模型(清华教程)
(2)驻留集——分配策略【王道】
(3)何时调入页面(亡羊补牢 or 未雨绸缪)
(4)在哪里调入?(经典加一层)
(5)抖动现象
(6)工作集(拓展-考试貌似不考~)
(7)总结
13、内存映射文件
(1)方便程序员——访问文件数据
(2)共享数据——同时访问一个文件
(3)总结(关于磁盘的IO,操作系统是专业滴!)
三、第三章——内存管理
1、内存的基础知识
相关知识点
逻辑地址——相对地址
物理地址——绝对地址
(1.1)程序装入(三种)——绝对装入
灵活性差,已经被淘汰了~
(1.2)程序装入(三种)——可重定位装入
在装入时——会转换好地址~(写死了物理地址,不能移动咯!)
(1.3)程序装入(三种)——动态重定位
现在使用方法——可以动态修改,灵活移动,动态申请空间…
(2)程序——exe的由来
1. 编写源代码:首先,您需要使用文本编辑器编写C语言源代码文件,通常以.c为扩展名。
2. 编译源代码:接下来,您需要使用C编译器将源代码编译为机器可以执行的目标代码。这个过程称为编译。编译器会对源代码进行词法分析、语法分析和语义分析,并生成相应的目标代码文件(通常以.obj为扩展名)。
3. 链接目标代码:在生成目标代码后,您需要使用链接器将目标代码与所需的库文件进行链接,以创建最终的可执行文件。链接器会解决函数和变量引用之间的依赖关系,并将目标代码转换为可执行文件的格式。最终生成的可执行文件通常以.exe(对于Windows系统)或无扩展名(对于Linux系统)为扩展名。
4. 运行可执行文件:一旦可执行文件生成成功,您可以直接执行它。
(3)程序——链接方法
(4)总结
2、内存管理的概念
(1)内存空间的分配和回收
如何分配?如何回收?还有哪些空闲?这么多位置,应该分配哪一块?
(2)内存空间的拓展(比如:虚拟内存等)
内存不够用,如何临时拓展?
(3)地址转换(逻辑地址-物理地址)
地址转换功能
(4)内存保护
如何让各进程之间,拥有自己的地皮,互不影响!
3、内存——覆盖与交换
(1)覆盖技术(已经out了)
程序员来完成——编程麻烦(out)
(2)交换技术
把暂时不需要的进程——拿到外存
(3)交换技术——对应的问题
(4)总结(考选择题)
4、连续分配管理方式
(1)单一连续分配
无外部碎片——但:有内部碎片【内存利用率低】
(2)固定分区分配
把用户空间——划分多个分区~
无外部碎片——但又内部碎片,内存利用率低
(3)动态分区分配
没有内部碎片,但有外部碎片!
(不过可以通过【拼凑】等方式,来解决【外部碎片】)
(4)总结
5、动态分区分配——算法(详细讲解)
(1)首次适应算法(第一次)
从头到尾,按顺序扫描!
找到第一个满足的空间,就放进去~
(2)最佳适应算法(从小到大)
这个是强迫症!——必须安排连续的空间(产生难以利用的小碎片)
额外创建一个——空闲分区链表——用来记录空闲空间的大小(从小到大排序!)
每次安排完后,都需要【维护该表】(数据更新,重新排序)
(3)最坏适应算法(从大到小)
和最佳相反——空间排序【从大到小】
缺点——如果来个了“大进程”——可能没有足够大的连续空间给他!
(4)临近适应算法(从大到小)
从小到大的【循环链表】
开销小【空间换时间】——但是——大分区容易被用完~
(5)总结(优缺点)
6、基本分页存储——概念
(1)页框——物理块——内存块——物理页面
Page Frame —— 页框(标准点)
物理块号——页帧号——内存块号
页表——存储【逻辑地址】与【物理地址】的映射关系
如何计算——页表的大小(根据内存大小推算)【具体步骤——看左下角】
页号不占空间!!!——数组索引【这个页表——类似于一维数组~】
为了计算机计算——页面大小用2的【整数幂】
在计算机网络那里类似,计算也是这样,要方便得多~
(2)逻辑地址-结构【页号+页内偏移量】
(3)总结——概念
(4)重点——地址变换过程(五步)
文字说明版本——五步骤
(5)重点——例题
如何将【逻辑地址】——转为【物理地址】
(6)重点——页表(如何存储在内存中)
计算机组成原理——也有讲哟~~~
页表——存放在内存当中——也称为(慢表)
计算页表项——占多少位(最好是2的次方!)实际应用中——方便计算!
(7)总结——地址变换
7、快表(TLB)
查询快表——不需要访存(快表是高速缓存)
(1)查询过程——1(先快表,再慢表,最后内存)
(2)查询过程——2(同时查找-快表-慢表)
(3)局部性原理
(4)总结 (TLB和高速缓存有区别!!!)
普通的Cache会存放各种数据
但是——TLB——只存放页表项的副本!!!
8、两级页表(开始套娃啦)
记住——加一层的解决方式——可以多次套娃!!!(可以不止两层哟~)
(1)从一级—二级—偏移量(转到物理地址)
(2)单级页表
(3)细节重点
条件:40位逻辑地址——知道物理块的大小(4KB)——页表的每一项的大小(4B)
①地址偏移量需要多少位?
总共40位,一个物理块有4KB,(2^12位)——采用2进制表示偏移量:需12位
②还是剩下多少位——用来表示各级页表?40-12 = 28
③怎么分各级页表?随便分?(题目限制:各级页表的大小不能超过一个内存块!)
④那么请问一个物理块可以容纳多少页表项?——2^12 / 4 = 2^10
每一级页表的大小不能超过物理块的大小!——那么只能按照内存块最大位数来分咯~
28 分为 10 – 10 – 8 (3级,一级:2^10,二级:2^10,三级:2^8)
当然,可以再分多级也可以啦~(只不过会有更多碎片!)
比如: 28分为 ——7,7,7,7(4级,每级2^7这么大)
详细结题——如下图:
(4)总结
9、段页式管理方式
(1)段表
段号——也可以隐含【类似数组的索引,是隐含的~】
(2)查询段表——顺序
分段中——每个长度不一样!!!
一定要越界检查!!!(段号是否越界?段内地址是否合法?)
(3)分段 & 分页 【对比】
分页——用户不可见——提高利用率——地址空间【一维——映射的物理地址】
分段——用户可见——满足用户需求——地址空间【二维——段名+段内地址】
分页——长度固定——更容易共享&保护
分段——长度不固定——
(4)总结
段表和页表——都存储在内存中——可以成为慢表
他们都可以再往上封装一层——即为:【快表】——加快CPU的查询效率!!!
(注意:这些术语只是方便我们理解,是前人们的智慧结晶~不要被这些术语锁死!)
快表为什么叫快表?因为他快!他在Cache里面,造价高…等等原因!
10、虚拟内存
(1)传统存储管理方式——特征、缺点
一次性——全部放入内存(太大了,可不行!)
驻留性——暂时用不上的(留着内存中,消耗了资源)
(2)虚拟内存——定义、特征
多次性、对换性、虚拟性
(3)如何实现——虚拟内存
【内存的页面】的【换入换出】(怎么实现)?
(4)总结
虚拟内存——是高速缓存技术的拓展!
既然你内存查询,都分了多个级别(Cache里面有三级)(内存里面就再分个级别吧~)
注意:计算机组成原理——在Cache章节,说明Cache的换入和换出!
为什么计算机组成原理那里只介绍了Cache的替换算法呢?
因为,【Cache替换】的实现是由【硬件】完成的!
在这里,【内存】由操作系统来管理,自然需要操作系统(系统软件)来实现啊!
虚拟内存是计算机系统中的一种技术,用于将磁盘空间作为辅助内存来扩展主存(RAM)的容量。
它允许操作系统将部分数据移动到磁盘上,并在需要时将其还原回主存。
虚拟内存的设计目的是提供比物理内存更大的地址空间,以及更灵活的内存管理。
虚拟内存与高速缓存是不同的概念。
高速缓存是一种位于处理器和主存之间的存储器层次结构,用于加快对常用数据的访问速度。
而虚拟内存是一种通过存储器映射技术实现的内存扩展机制,用于增加可用的地址空间。
关于计算机组成原理中只介绍了Cache的替换算法而没有涉及虚拟内存的解释,可能是因为计算机组成原理的重点是硬件层面的设计和实现。
因此,在讲解Cache时主要侧重于硬件层面的实现细节,如替换算法、缓存一致性、写策略等。
而虚拟内存的管理是由操作系统来完成的,属于系统软件的范畴,因此在计算机组成原理这门课程中可能没有过多介绍。
需要注意的是,虚拟内存和Cache是不同层次的存储器技术,各自有不同的设计原理和实现方法。虚拟内存的管理涉及到操作系统的内存管理模块,而Cache的管理则由硬件电路来完成。
11、请求页面——管理方式
(1)缺页中断(内中断)
没有需要的页——产生中断
如果有空闲块——直接占用(没有的话,使用页面置换算法~)
(2)地址变换
(3)总结
12、页面置换算法
(1)最佳置换算法(无法实现)
这个是——理想算法(实际应用中,无法实现)
因为——他需要提前知道后面需要访问的页面是什么!(很显然,不能做到)
(2)先进先出算法(绝对公平——Belady异常)
性能差——注意——Belady异常!(随着访问次数增多,缺页次数反而减少!)
(3)最近最久未使用置换算法(LRU)
适用于局部性好的(性能好)——需要硬件支持,开销大
(4)时钟页面置换算法(CLOCK & NRU)
扫描的过程——像一个时钟——不断计数(访问位为:0 / 1)
最近未用算法
最坏情况——扫两轮(一圈多一点)
(5)时钟页面置换算法——改进型
会筛选4轮!(最坏情况下,要转3圈多一点)
1、未访问、未修改
2、未访问、已修改
3、已访问、未修改
4、已访问、已修改
(注意:访问的权利大!排在最后!)
(6)总结(要会手推——页面替换)
PS:并不止这些算法,还有其他替换算法哟~
比如——随机替换算法(和猴子排序类似的有趣,哈哈哈~)
最不常用算法(LFU)——考虑的是访问次数 or 频率
12、页面分配策略、抖动、工作集
(1)工作集模型(清华教程)
工作集——内存的区间(大小)——我觉得成为【工作间还挺好~】
【你活动的空间太大了,不太好】
【你活动的空间太小了,也不太好~】
当你经常卡壳(说明你活动空间小,需要增多活动空间)
当你不卡壳(说明你活得很滋润,浪费了一些空间,需要给你减少空间!)
资本家看了都流泪(┭┮﹏┭┮)~
(2)驻留集——分配策略【王道】
1、开始给你分配固定的大小工作空间
2、动态给你调整(调整又分为内部调整、外部调整)
内部调整(局部)——把你进程内部的物理块变为工作区间
外部调整(全局)——把外部空间(空闲)物理块给你
(3)何时调入页面(亡羊补牢 or 未雨绸缪)
先调入?还是缺了再调入?(具体场景,具体分析~)
(4)在哪里调入?(经典加一层)
在外存中,再套一层(对换区)
方便页面置换(换出来的页面就放到“对换区”)
(5)抖动现象
物理块不够时,频繁访问页面——导致(频繁出现“缺页中断”)
(6)工作集(拓展-考试貌似不考~)
工作集 ≠ 驻留集
驻留集——给定的工作空间
工作集——在工作空间里(加了一个窗口,也就是时间间隔)
因此——驻留集 > 工作集
(7)总结
13、内存映射文件
(1)方便程序员——访问文件数据
传统方式——程序员手动写read、write方法,很麻烦
优化方式——操作系统为我们完成对外存的读和写(相当于操作系统封装了一层~)
我们就可以像——操作C语言那样,完成指定的读入和写入啦~
(2)共享数据——同时访问一个文件
参考Windows上的.txt文件(并不是互斥的哟~)
- 我可以用【记事本】打开~
- 我还可以用【VsCode】打开~
(3)总结(关于磁盘的IO,操作系统是专业滴!)
什么时候读,什么时候写(可以让操作系统来完成~)这方面的性能可以让操作系统来优化
程序员就可以放开手脚做其他的事情啦~
(当然,对应强迫症的工程师,可以自己来控制和考虑啦~)