《操作系统》学习笔记---存储管理
目录
重定位
- 逻辑地址(相对地址):用户程序经编译之后的每个目标模块都以0为基地址开始顺序编址
- 物理地址(绝对地址):内存中各物理存储单元的地址是从统一的基地址开始顺序编址
- 逻辑地址空间(地址空间):由程序中逻辑地址组成的地址范围
- 内存空间(物理空间或绝对空间):由内存中一系列存储单元所限定的地址范围
程序装入方式
- 绝对装入方式:在装入模块中的所有地址都是绝对地址
- 可重定位装入方式:装入模块内使用的地址都是相对地址
- 动态运行时装入方式:进程的内存映像在不同时候处于不同位置
重定位
将逻辑地址转变为内存物理地址的过程
- 静态重定位:在目标程序装入内存时,由装入程序对目标程序中的指令和数据的地址进行修改,即把程序的逻辑地址改为实际的内存地址
- 优点:无需增加硬件地址转换机构
- 缺点:
- 程序的存储空间只能是连续的一片区域,而且在重定位之后不能再移动
- 各用户进程很难共享内存中的同一程序的副本
- 动态重定位:在程序执行期间,每次访问内存之前进行重定位
- 优点:
- 程序占用的内存空间动态可变,不必连续
- 容易实现共享程序副本
- 提供虚拟内存的基础
- 缺点:需要硬件支持,增加成本
- 优点:
早期的内存管理方式
覆盖技术
将内存的可用空间划分成一个固定区和多个覆盖区;把程序划分为若干个功能上相对独立的程序段,按照其自身的逻辑结构使那些不会同时运行的程序段共享同一块内存区域。用于早期的操作系统
- 例子:主程序放在固定区,不会同时运行的两个子程序段可以共用一个覆盖区;运行的放入内存,不运行的放在磁盘
- 优点:小内存运行大作业,从逻辑上扩充容量
- 缺点:
- 编程时必须划分程序模块和确定程序模块之间的覆盖关系
- 从外存装入需要一定开销
对换技术
将内存全部提供给一个进程使用,其他进程放在磁盘上。每次调入一个进程,分给一定的运行时间片。用于现代操作系统
- 优点:
- 减轻程序员负担,不需要考虑覆盖结构
- 小内存运行大作业,因为一个进程用所有内存,多进程时也可以通过换出别的进程使用大部分内存
- 缺点:
- 进程的换入、换出需要一定开销
- 会有外碎片产生
分区法
为了支持多道程序设计的内存管理方式,除去操作系统占用内存的某个固定分区,其余内存供其他进程使用,并且划分为多个分区,一个分区容纳一个进程
碎片
- 外碎片:在一个分区内出现的碎片
- 内碎片:所有分区之外的新增碎片
固定分区法
内存中分区的个数不变,各个分区的大小也固定不变,一个分区只可装入一个进程
-
等分方式:各个分区同样大小
- 缺点:浪费大或者无法装入大程序
-
差分方式:各个分区不同大小
-
固定分区的缺点:内碎片问题,进程数受限
动态分区法
内存中的分区大小和个数都是可变的,在相应进程装入内存时才建立分区,使其刚好适应进程大小
- 分配算法
- 最先适应算法:从低地址开始查找,使用第一个可以满足的未用内存区
- 优点:为大进程预留高地址的大内存区,并且便于释放内存时合并
- 缺点:低地址出现很小的外碎片,内存利用率变低
- 最佳适应算法:未用内存区按大小排序,从小到大开始查找,使用第一个可以满足的未用内存区
- 优点:多余的空间最小
- 缺点:不便于合并,同样会出现很小的外碎片
- 循环适应算法:最先适应算法的变种。找到合适内存区后记录下当前位置,下次查找从记录位置开始
- 优点:使内存的空闲区分布得更均匀,减少查找得开销
- 缺点:无法为大进程预留空间
- 最坏适应算法:最佳适应算法的“逆”。未用内存区按大小排序,先分配大的内存区
- 优点:基本思想是为了尽量不产生外碎片
- 缺点:还是会产生很多外碎片
- 最先适应算法:从低地址开始查找,使用第一个可以满足的未用内存区
- 动态分区的优点:有利于多道程序设计,不产生内碎片
- 动态分区的缺点:外碎片问题,内存利用率低
- 解决外碎片问题:
- 紧缩技术:定时或在分配内存时把所有碎片合并为一个连续区。各进程按地址大小向两边靠拢,将空闲区保留在内存的中间部分
- 优点:消除外碎片
- 缺点:紧缩花费大量的CPU时间,不能共享
- 分页
- 紧缩技术:定时或在分配内存时把所有碎片合并为一个连续区。各进程按地址大小向两边靠拢,将空闲区保留在内存的中间部分
分页
实现
- 逻辑空间分页:把进程的逻辑地址空间分程若干大小相同的部分,称为页或页面,由硬件确定大小
- 内存空间分块:把内存等分成与页面大小相同的若干存储空间,称为内存块或页框
- 逻辑地址表示:两部分组成。低位部分为页内偏移地址,位数由页大小决定;高位部分为剩余的高位。
- 页号p = 逻辑地址A/页大小L
- 页内偏移d = 逻辑地址A%页大小L
- 内存分配原则:系统按进程页数目将对应内存块分配给进程,页是连续的,但内存块可以不连续
- 页表:实现从页号到物理块号的地址映射
- 内存块表:记录内存块是否已分配出去,分配给哪一个进程
快表
- 一种特殊的高速缓冲存储器,比访存快,但容量有一定限制和利用了程序局部性,所以只存放部分页表项(页号和内存块号的映射)
- 解决问题:使用一级页表需要二次访存
- 出现问题:若未击中,则还是需要二次访存。所以要利用好程序局部性选择合适的置换策略
- 置换策略:LRU算法
页的共享和保护
- 利用页表本身进行保护:访问内存需要进行地址转换,使得进程都在自己的内存空间活动
- 设置存取控制位:给每个页表项设置存取控制字段,设定为只读(R)、读写(RW),读和执行(RX)
分段
程序的地址空间按照程序自身的逻辑关系划分为若干段
段的共享和保护
- 利用段表本身进行保护:段表项有段长字段,段内地址和段长比较;段号和段表长度比较,使得进程都在自己的内存空间活动
- 设置存取控制位
- 保护环:重要的服务和操作系统核心在0环(最高优先级),用户程序在3环(最低优先级)
分页和分段的区别
- 页是物理单位,系统直接对程序进行分页,是面向系统、硬件的;段是逻辑单位,根据程序里面不同内容的不同作用进行分段,用户知道程序分成了多少段,是面向用户的
- 页的大小由系统确定,一个系统所有页大小相同;段的大小由程序段确定,不一定相同
- 分页的进程地址空间是一维的,块号+偏移量;分段的进程地址空间是二维的,段基址+偏移量
- 分页很难实现代码和数据分离,因此难以保护和共享;分段容易实现
段页式
实现
- 等分内存
- 进程的地址空间分段
- 段内分页
- 段表找页表,页表找内存块
虚拟内存
用户可编址的一段连续的虚拟地址空间,比真实内存空间大
特征
- 虚拟扩充:扩充逻辑上的内存空间,实现小内存运行大作业
- 部分装入:利用程序执行过程显示局部性的特点,每个进程部分装入内存
- 离散分配:跟以前一样,物理内存块不需要连续
- 多次对换:因为是部分装入,进程运行时需要的程序和数据要多次调入内存,内存空间不足时把不需要的程序和数据调出内存
限制
- 地址线数
- 磁盘的容量
请求分页
- 发生缺页中断
- 保存进程A断点信息
- 检查该页的访问是否合法,确定该页在磁盘的位置
- 将该页从磁盘上读到空闲内存块
- IO完成,发出IO中断
- 保存进程B断点信息
- 调整页表和其他表格,标明所需页已放入内存
- 进程A就绪,系统进行调度(不一定是A或B)
页面置换算法
页面置换算法选择不佳,会导致系统大部分时间都花费在页面的调度和传输上
页面置换过程
- 找出所需页面在磁盘上的位置
- 找出空闲内存块。若没有空闲内存块,则需要页面置换算法选择一个置换的内存块换出到磁盘
- 把所需页面读入内存块
- 重启进程
-
先进先出法:淘汰在内存中停留最久的页面
- 优点:实现简单
- 缺点:性能差,效率低
-
最佳置换法:淘汰将来不被使用的页面、或者最远的将来才被使用的页面
- 优点:保证最小的缺页率
- 缺点:不现实,实现难,因为预先不了未来的情况
- 这个算法可以用来衡量其他算法的优劣
-
最近最久未使用置换法:淘汰最近一段时间内最久没有使用过的页面
- 实现:使用计数器,或者栈
- 优点:效果不错,即便比OPT差
- 缺点:需要硬件支持,也需要软件开销
-
最近未使用置换法:淘汰最近一段时间内未使用的页面
- 实现
- 页表项设引用位R代表最近是否访问过,修改位M代表是否修改
- 引用位定期清0,每次访问内存时,引用位置1
- 分四类。0:最近未访问+未修改;1:最近未访问+修改;2:最近访问+未修改;3:最近访问+修改
- 执行过程
- 扫描循环队列,寻找第0类,第一个0类的页面就是淘汰页面
- 若第一步失败,则再次扫描循环队列,寻找第1类,过程中把所有引用为置0,第一个1类的页面就是淘汰页面
- 若第二步失败,此时重复1、2步必定能找到淘汰页面
- 优点:第一步成功可以避免把页面写回磁盘的开销
- 缺点:多次扫描的开销
- 实现
-
第二次机会置换法:改进FIFO,避免把经常使用的页面置换出去
- 实现:利用引用位R,扫描队列,为0淘汰,为1置0并放在链表末尾
- 优点:改进了FIFO,有更好的性能
- 缺点:所有页面引用位为1,退化为FIFO
-
时钟置换法:第二次机会置换法的改进
- 实现:利用环形链表,避免引用位为1是的链表操作
内存块的分配和抖动
内存块分配
- 固定分配策略:分配给进程的内存块数是固定的
- 可变分配策略:运训分配给进程的内存块数随进程的活动而改变
- 全局置换:允许一个进程从全体内存块的集合中选取淘汰块
- 局部置换:每个进程只能从分给它的一组内存块选择淘汰快
- 策略
- 局部置换+固定分配
- 缺点:内存块数少了不好、多了也不好
- 局部置换+可变分配
- 优点:性能好
- 缺点:实现复杂
- 全局置换+可变分配
- 优点:实现容易
- 缺点:淘汰别的进程的页面,提高缺页率
- 局部置换+固定分配
抖动问题
整个系统页面置换十分频繁,以致大部分机器时间都用在来回进行的页面调度,小部分时间进行实际运算