内存管理
内存基础知识
存放数据的硬件,程序执行前需要将数据放到内存里才能被CPU处理
逻辑地址-物理地址
进程运行基本原理
从代码到进程需要经过编译,链接,装入内存
链接方式
- 静态:链接成完整模块
- 装入时动态:运行前边装入边链接
- 运行时动态:只有需要的模块才需要装入链接
装入方式
- 绝对装入:编译时产生绝对地址
- 可重定位装入:装入时将逻辑地址改成物理地址
- 动态运行时装入:运行时将逻辑地址改成物理地址
内存管理概念
操作系统对内存管理需要实现的功能:
- 内存空间的分配与回收
- 连续分配:
1. 单一连续分配:内存划分为系统区和用户区,并且只允许存放一道用户程序。实现简单,无外部碎片,有内部碎片,CPU利用率低
2. 固定分区分配:内存的用户区划分为多个区域,大小可以相等可以不相等。(分区大小相等)缺乏灵活性,适合一台计算机控制多个对象的场合。(分区大小不相等)灵活性较高。需建立分区说明表,记录分区的地址、状态等。实现简单,无外部碎片,但又内部碎片,CPU利用率低,并且程序太大的时候不能满足需求
3. 动态分区分配:装入内存时根据大小分配空间。需建立分区说明表,状态,分区大小,起始地址等都需要被记录。没有内部碎片,有外部碎片
没想到这里好像还要加很多的内容,分区算法啥的写后面算了,goto动态分区分配算法- 非连续分配 也放到后面了
- 提供某种技术从逻辑上对内存空间进行扩充
- 覆盖技术:将程序分为多个段,常用的段常驻内存,不常用的需要时再调入内存。在内存中设置固定区和覆盖区,固定区存放常驻的段。对用户不透明,增加编程负担
- 交换技术:将某些进程暂停换出外存,把外存中某些具备运行条件的进程调入内存(PCB常驻内存)
- 虚拟存储技术
- 实现逻辑地址到绝对地址的转换
- 内存保护
上下限寄存器,重定位寄存器和界地址寄存器
动态分区分配算法
- 首次适应算法
每次从低地址开始查找,找到第一个满足大小的空闲分区 - 最佳适应算法
优先选取大小最适合的区间。空间分区按照容量递增次序链接,每次从头查找,找第一个满足的分区。会导致留下越来越多很小的难以利用的内存块。 - 最坏适应算法
优先使用最大的空闲分区 - 临近适应算法
把地址按照递增的顺序排序,每次从上次查找结束的位置开始查找,找到的第一个可用分区就可。
非连续分配
分页存储管理(跟计组撞了)
基本地址变换机构
借助进程的页表将逻辑地址转化为物理地址。通常会设置页表寄存器,存放页表在内存中的起始地址和页表长度。当进程未执行时,页表开始地址和长度都存放在PCB中。
为了查询方便,一般使每个页面恰好装得下整个页表项
具有快表的地址变换机构
局部性原理
时间局部性:如果执行了某指令,该指令不久后很可能再次执行;如果访问了一个数据,该数据不久后很可能再次被访问
空间局部性:一旦程序访问了某储存单元,在不久之后其附近的储存单元也很可能被访问
快表TLB
快表/联想寄存器,是一种访问速度比内存块很多的高速缓冲寄存器,用来存放当前访问的若干页表项,以加速地址变换的过程。与此对应,内存中的页表也称慢表
两级页表
单级页表的问题:
- 页表必须连续存放,当页表很大的时候需要占用很多连续的内存框
- 没必要让整个页表常驻内存
原理和地址结构
将地址划分成三个部分,分别对应一级页号,二级页号,页内偏移量。用一个总表去记录二级页号的位置,搜索时从一级找到二级,再经过二级找到页内偏移量,这样二级页号就不需要连续存放。
一些细节
- 各级页表的大小不能超过一个页面
- 不止二级页表,可以三级四级一直套娃下去
- n级页表访问次数为n+1
基本分段储存管理
分段
按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名,每段从0开始编址。以段为单位进行分配内存,每个段在内存中占连续空间,各个段可以不相邻。
段表
类似页表,作用一样
一行有三个数据:段号,段长,基址
各个段表项的长度是相同的
分段和分页的对比
- 分页对用户不可见,分段对用户可见
- 分页的地址空间是一维的,分段的地址空间是二维的
- 分段更容易实现信息的共享和保护
- 分页和分段访问一个逻辑地址都需要两次访存,分段也可以引入快表机制
段页式管理方式
定义
将进程按逻辑模块划分,再将各分段进行分页,再将内存空间分为大小相同的内存块。进程运行前将各页面分别装入各内存块中。
地址结构
段号+页号+页内偏移量
把程序分段可见,把段分页不可见
段表和页表
段表是总表,包含段号、页表长度、页表存放块号,指向页表。页表包含页号和内存块号,指向内存中的数据的地址。
虚拟内存
定义和特征
基于局部性原理,在程序装入内存时,可以将程序中很快用到的部分装入内存,暂时用不到的部分留在外存。在程序执行过程中,当所访问的信息不再内存中时,由操作系统将所需信息从外存调入内存。若内存空间不够,由操作系统将内存中暂时用不到的信息换到外存
特征:
- 多次性:不需要一次装入内存
- 对换性:无需常驻内存
- 虚拟性:大于实际容量
请求分页管理方式
页表机制
页表结构:页号,内存块号,状态位,访问字段,修改位,外存地址
状态位记录是否已经调入内存
访问字段记录最近被访问次数或者上一次被访问的时间,用于置换算法
修改位记录是否被修改过
缺页中断机构
当要访问的页面不存在与内存中时,发送缺页中断,操作系统挂起当前进程,然后去外存里面找缺少的页面。如果内存中有空位,直接把要的页面放入内存,如果没有的话就用淘汰算法淘汰一个页面再写入。
缺页中断属于内中断
地址变换机构
检查页面是否在内存中,如果不在就请求调页,若内存空间不够,换出页面,页面调入内存后修改相应的页表项
页面置换算法
- 最佳置换算法OPT
淘汰以后永远不会使用或最长时间内不在被访问的页面
无法实现,不知道之后的运行序列 - 先进先出置换算法FIFO
淘汰最早进入的页面
belady异常:当为进程分配的物理块数增大时,缺页次数不减反增。只有FIFO会造成belady异常 - 最近最久未使用置换算法LRU
淘汰最久未使用的页面。记录页面上一次访问时间就行 - 时钟置换算法CLOCK
每个页面设置一个访问位,将内存中的页面通过指针连成一个环。页面被访问时访问位设置为1。当需要淘汰页面时,按照指针顺序遍历,遇到访问位为1的就设置为0,是0就换出 - 改进时钟置换算法
设置访问位修改位,先找访问位修改位全为0的淘汰,该轮不会修改数据。如果寻找失败,第二轮扫描寻找01的页面,如果都没有,把访问位设置为0。然后再找00,失败再找01
页面分配策略
一些名词定义
驻留集:请求分页存储管理中给进程分配的物理块的集合
固定分配:驻留集不变
可变分配:驻留集可变
局部置换:只能置换本进程的物理块
全局置换:可以置换任何物理块
几种组合策略
固定分配全局置换
可变分配全局置换
可变分配局部置换
调入页面策略
- 预调页策略
根据局部性原理一次调入若干页面
预测成功率不高,应用于首次调入,程序员指定调入某些部分 - 请求调页策略
缺的时候再调入,I/O开销大
抖动现象
进程分配的物理块不够