目录
内存管理概念
内存的基础知识
什么是内存?有何作用?
程序执行前需要先放到内存中才能被CPU处理——缓和CPU与硬盘之间的速度矛盾
补充知识:几个常用的数量单位
指令的工作原理
三种装入方式
绝对装入
可重定位装入
动态重定位
从写程序到程序运行 (静态链接为例)
链接的三种方式
- 静态链接:程序运行之前,将库函数连接成一个完整的可执行程序
- 装入时动态链接:将用户源程序编译后得到目标模块,装入内存时,采用边装入边链接的方式
- 运行时动态链接:对于某些目标模块的链接,程序需要时才会对其链接 ,便于修改和更新,便于实现对目标模块的共享
总结 
内存管理的概念
内存保护
内存空间的扩充
覆盖技术
交换技术
注意: PCB 会常驻内存,不会被换出外存 ,其内部记录了该进程换出去的那个位置
- 应该在外存(磁盘)的什么位置保存被换出的进程?
- 什么时候应该交换?
- 应该换出哪些进程?
内存空间的分配与回收
连续分配管理方式
连续分配:指为用户进程分配的必须是一个连续的内存空间
单一连续分配
固定分区分配
动态分区分配
动态分区分配没有内部碎片,但是有外部碎片。
- 内部碎片,分配给某进程的内存区域中,如果有些部分没有用上。
- 外部碎片,是指内存中的某些空闲分区由于太小而难以利用。
如果内存中空闲空间的总和本来可以满足某进程的要求但由于进程需要的是一整块连续的内存空间,因此这些“碎片”不能满足进程的需求可以通过紧凑(拼凑,Compaction) 技术来解决外部碎片。
总结
动态分区分配算法
在动态分区分配方式中,当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配?
首次适应算法
算法思想: 每次都从低地址开始查找,找到第一个能满足大小的空闲分区。
如何实现: 空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
最佳适应算法
算法思想: 由于动态分区分配是一种连续分配方式,为各进程分配的空间必须是连续的一整片区域。因此为了保证当“大进程”到来时能有连续的大片空间,可以尽可能多地留下大片的空闲区即,优先使用更小的空闲区。
如何实现: 空闲分区按容量递增次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
最坏适应算法
又称 最大适应算法 (Largest Fit)
算法思想: 为了解决最佳适应算法的问题-一即留下太多难以利用的小碎片,可以在每次分配时优先使用最大的连续空闲区,这样分配后剩余的空闲区就不会太小,更方便使用。
如何实现: 空闲分区按容量递减次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
邻近适应算法
算法思想: 首次适应算法每次都从链头开始查找的。这可能会导致低地址部分出现很多小的空闲分区,而每次分配查找时,都要经过这些分区,因此也增加了查找的开销。如果每次都从上次查找结束的位置开始检索,就能解决上述问题。
如何实现: 空闲分区以地址递增的顺序排列 (可排成一个循环链表)。每次分配内存时从上次查找结束的位置开始查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
总结
非连续分配管理方式
为用户进程分配的可以是一些分散的内存空间
基本分页存储管理的基本概念
总结
基本地址变换机构
用于实现逻辑地址到物理地址转换的一组硬件机构
总结
具有快表的地址变换机构
是基本地址变换机构的改进版本,可以让地址变化的过程更快
局部性原理
TLB和普通Cache 的区别--TLB 中只有表项的副本,而普通Cache 中可能会有其他各种数据的副本
两级页表
- 根据页号查询页表的方法: K 号页对应的页表项存放位置 = 页表始址 + K*4要在所有的页表项都连续存放的基础上才能用这种方法找到页表项
- 根据局部性原理可知,很多时候,进程在一段时间内只需要访问某几个页面就可以正常运行了。因此没有必要让整个页表都常驻内存。
由上述分析可得到单级页表的问题如下:
- 页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框.
- 没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问某几个特定的页面。
基本分段存储管理
与“分页”最大的区别就是--离散分配时所分配地址空间的基本单位不同
分段、分页管理的对比
段页式管理方式
虚拟内存管理
传统存储管理方式的特征、缺点
虚拟内存的定义和特征
- 多次性:作业在运行时,分多次调入内存运行
- 对换性:作业不必一直驻留内存,允许作业在运行过程中进行换进换出
- 虚拟性:从逻辑上扩充内存容量,使用户看到的内存容量远大于实际的内存容量
如何实现虚拟内存技术
虚拟内存技术,允许一个作业分多次调入内存。如果采用连续分配方式,会不方便实现。因此,虚拟内存的实现需要建立在离散分配的内存管理方式基础上。
主要思想:在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。
- 操作系统要提供请求调页 (或请求调段) 功能,即把需要的分页/端从外存调入内存中
- 操作系统要提供页面置换 或段置换) 的功能,即把暂时不需要的分页/端从内存调出外存中
请求分页管理方式
请求页表
缺页中断
未修改过的页面不需要写回外存的原因是,如果页面在内存期间没有被修改过,那么其与外存中的页面是一致的,不需要进行同步操作。因此,在页面置换时,只需要将被淘汰的未修改页面从内存中移除即可,不需要进行写回操作,以提高系统的效率。
地址转换流程
页面置换算法
最佳置换算法 (OPT)
最佳置换算法 (OPT,Optimal): 每次选择淘汰的页面将是以后永不使用,或者在最长时间内不再被访问的页面,这样可以保证最低的缺页率。
最佳置换算法可以保证最低的缺页率,但实际上,只有在进程执行的过程中才能知道接下来会访问到的是哪个页面。操作系统无法提前预判页面访问序列。因此,最佳置换算法是无法实现的。
先进先出置换算法 (FIFO)
先进先出置换算法(FIFO): 每次选择淘汰的页面是最早进入内存的页面
实现方法:把调入内存的页面根据调入的先后顺序排成一个队列,需要换出页面时选择队头页面即可
队列的最大长度取决于系统为进程分配了多少个内存块。
最近最久未使用置换算法(LRU)
最近最久未使用置换算法 (LRU,least recently used): 每次淘汰的页面是最近最久未使用的页面
实现方法: 赋予每个页面对应的页表项中,用访问字段记录该页面自上次被访问以来所经历的时间t.当需要淘汰一个页面时,选择现有页面中t值最大的,即最近最久未使用的页面。
时钟置换算法 (CLOCK)
改进型CLOCK算法
页面分配策略
驻留集
驻留集: 指请求分页存储管理中给进程分配的物理块的集合。
在采用了虚拟存储技术的系统中,驻留集大小一般小于进程的总大小。
考虑一个极端情况,若某进程共有100个页面,则该进程的驻留大小为100时进程可以全部放入内存,运行期间不可能再发生决页。若驻留集大小为1,则进程运行期间必定会极频繁地缺页
页面分配、置换策略
- 固定分配:操作系统为每个进程分配一组固定数目的物理块,在进程运行期间不再改变。即,驻留集大小不变
- 可变分配:先为每个进程分配一定数目的物理块,在进程运行期间,可根据情况做适当的增加或减少。即,驻留集大小可变
- 局部置换:发生缺页时只能选进程自己的物理块进行置换。
- 全局置换:可以将操作系统保留的空闲物理块分配给缺页进程,也可以将别的进程持有的物理块置换到外存,再分配给缺页进程。
系统会锁定一些页面,这些页面中的内容不能置换出外存(如: 重要的内核数据可以设为“锁定”)
页面调动时机策略
- 预调页策略:根据局部性原理(主要指空间局部性,即:如果当前访问了某个内存单元,在之后很有可能会接着访问与其相邻的那些内存单元。),一次调入若工个相邻的页面可能比一次调入一个页面更高效。但如果提前调入的页面中大多数都没被访问过,则又是低效的。因此可以预测不久之后可能访问到的页面,将它们预先调入内存,但目前预测成功率只有50%左右。故这种策略主要用于进程的首次调入由程序员指出应该先调入哪些部分。(运行前调入)
- 请求调页策略:进程在运行期间发现缺页时才将所缺页面调入内存。由这种策略调入的页面一定会被访问到,但由于每次只能调入一页,而每次调页都要磁盘I/0操作,因此I/0开销较大。(运行时调入)
页面调动位置策略
抖动(颠簸)现象
内存映射文件
内存映射文件一一操作系统向上层程序员提供的功能(系统调用)
- 方便程序员访问文件数据
- 方便多个进程共享同一个文件