虚拟内存管理包括虚拟内存概念、请求分页管理方式、页面置换算法、页面分配策略、工作集和抖动。
1.内存管理的概念
内存管理(Memory Management)是操作系统设计中最重要和最复杂的内容之一。虽然计算机硬件一直在飞速发展,内存容量也在不断增长,但是仍然不可能将所有用户进程和系统所需要的全部程序和数据放入主存中,所以操作系统必须将内存空间进行合理地划分和有效地动态分配。操作系统对内存的划分和动态分配,就是内存管理的概念。
有效的内存管理在多道程序设计中非常重要,不仅方便用户使用存储器、提高内存利用率,还可以通过虚拟技术从逻辑上扩充存储器。
内存管理的功能有:
- 内存空间的分配与回收:由操作系统完成主存储器空间的分配和管理,使程序员摆脱存储分配的麻烦,提高编程效率。
- 地址转换:在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致,因此存储管理必须提供地址变换功能,把逻辑地址转换成相应的物理地址。
- 内存空间的扩充:利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存。
- 存储保护:保证各道作业在各自的存储空间内运行,.互不干扰。
在进行具体的内存管理之前,需要了解进程运行的基本原理和要求。
装入和链接
装入
1.绝对装入
目标模块采用绝对地址
逻辑地址和实际地址完全相同
适用于单道环境
2.可重定位装入
在程序装入的时候装入
存在地址变换,但是是直接找的当前合适的内存位置
程序需要连续空间
不存在在程序执行的过程中在内存移动
3.动态运行时装入
地址转换在程序需要真正执行时才进行
可以在内存之中移动
可以实现虚拟存储
链接
1.静态链接
在程序运行之前,将各目标模块以及它们需要的库函数链接成一个完整的转入模块
2.装入时动态链接
在装入的时候边装入边链接
便于修改和更新
便于实现目标模块的共享
3.运行时动态链接
当程序需要的时候采取链接
节约内存空间、加快装入过程
2 内存覆盖与内存交换
内存覆盖
早期的计算机系统中,主存容量很小,虽然主存中仅存放一道用户程序,但是存储空间放不下用户进程的现象也经常发生,这一矛盾可以用覆盖技术来解决。
覆盖的基本思想是:由于程序运行时并非任何时候都要访问程序及数据的各个部分(尤其是大程序),因此可以把用户空间分成一个固定区和若干个覆盖区。将经常活跃的部分放在固定区,其余部分按调用关系分段。首先将那些即将要访问的段放入覆盖区,其他段放在外存中,在需要调用前,系统再将其调入覆盖区,替换覆盖区中原有的段。
覆盖技术的特点是打破了必须将一个进程的全部信息装入主存后才能运行的限制,但当同时运行程序的代码量大于主存时仍不能运行。
内存交换
交换(对换)的基本思想是,把处于等待状态(或在CPU调度原则下被剥夺运行权利)的程序从内存移到辅存,把内存空间腾出来,这一过程又叫换出;把准备好竞争CPU运行的程序从辅存移到内存,这一过程又称为换入。中级调度就是釆用交换技术。
例如,有一个CPU釆用时间片轮转调度算法的多道程序环境。时间片到,内存管理器将刚刚执行过的进程换出,将另一进程换入到刚刚释放的内存空间中。同时,CPU调度器可以将时间片分配给其他已在内存中的进程。每个进程用完时间片都与另一进程交换。理想情况下,内存管理器的交换过程速度足够快,总有进程在内存中可以执行。
有关交换需要注意以下几个问题:
- 交换需要备份存储,通常是快速磁盘。它必须足够大,并且提供对这些内存映像的直接访问。
- 为了有效使用CPU,需要每个进程的执行时间比交换时间长,而影响交换时间的主要是转移时间。转移时间与所交换的内存空间成正比。
- 如果换出进程,必须确保该进程是完全处于空闲状态。
- 交换空间通常作为磁盘的一整块,且独立于文件系统,因此使用就可能很快。
- 交换通常在有许多进程运行且内存空间吃紧时开始启动,而系统负荷降低就暂停。
- 普通的交换使用不多,但交换策略的某些变种在许多系统中(如UNIX系统)仍发挥作用。
交换技术主要是在不同进程(或作业)之间进行,而覆盖则用于同一个程序或进程中。由于覆盖技术要求给出程序段之间的覆盖结构,使得其对用户和程序员不透明,所以对于主存无法存放用户程序的矛盾,现代操作系统是通过虚拟内存技术来解决的,覆盖技术则已成为历史;而交换技术在现代操作系统中仍具有较强的生命力。
3 内存连续分配管理方式
- 单一连续分配: 即单用户、单任务使用内存一部分用于OS 一部分用于用户
- 固定分区分配:分区大小固定 ,分区数目固定,在内存中固定分配
1.分区使用表 分区的使用情况
2.内存利用与回收
3.缺点
规定了分区大小,大程序无法装入
限制了活跃进程的最大数
碎片过多
扩充和贡献困难
- 动态分区分配
1.算法
首次适应算法:每一次从头开始 导致空闲区间分配不均
循环首次适应算法:从上次找到的空闲分区的下一个空闲分区开始查找可能会有小的程序占据大的空闲分区,会缺乏大的空闲分区
最佳适应算法:以分区的容量大小, 寻找第一个符合要求的会导致更多的小空间
最坏适应算法 :和上面的算法让容量递减会导致大的空闲空间不足
2.管理空闲分区
空闲分区表
空闲分区链
3.分区回收
要回收的分区上或下存在空闲分区,则合并
上下都有是则分区数减一,将下面的空闲分区从空闲表或链表中删掉
上或者下有(只有一个)则不变
不存在则自己新建为新 空闲分区数加一
4.分区分配
存在一个最小不可再分割的大小
5.没有程序数目和大小的限制但是会产生过多的碎片
动态重定位分配
分区后剩余的一些碎片分区通过拼接形成更大的空闲分区
但会涉及到程序在内存中位置的变化
因此采用重定位的方法进行位置的变化
- 重定位寄存器
- 地址变换机构
伙伴系统(动态和固定分区的折中)
伙伴算法
内存分配 当进程申请大小为n的空间时,设2`i-1<n≤2`i,则为进程分配大小为2`i的空间 (初始化2`m) 不存在则寻找更大的进行对半分配
内存回收 合并伙伴相邻的大小相等的伙伴分区合并造成空间的浪费
在进程释放存储空间时,寻找伙伴合并,可以做到类似递归进行,直到找不到可以合并的伙伴为止
交换(中期调度)
以进程为单位
以页或段为单位
4 内存非连续分配管理方式
基本分页存储管理方式
1.存储空间
主存中为块
进程的逻辑结构中为页
2.页面与页表
逻辑空间称为页面 对应内存中的块
页表是记录页面在物理地址中对应的数据结构
最后一个页面存在这页面碎片
页表存放
页表
为记录页面在内存中对应的物理块
页表:页号,块号
逻辑地址构成
页号
即在第几页
页内位移
即距离页面里面第一个地址的距离
总的大小为页面大小,如1KB的页面,会有2的10次方的地址
逻辑地址从0开始
3.为解决连续分配方式存在的碎片
4.地址变换机构
4.1分页逻辑地址
页号和页内位移
二进制:
逻辑地址大小2`m 页面大小2`n
则前m-n位表示页号 后n位表示页内位移
十进制:
记A为逻辑地址,L为页面大小,则:
页号:P=int(A/L); 页内地址:d=A mod L
4.2映射 页号得到物理地址的基地址
基地址:页号对应的物理块号乘以页面大小即(块大小)
基地址加上页内位移即实际物理地址
4.3快表
设置的一个认为常用的页面集合
因为:访问页表要访问2次以上主存
局部性原理:所有的存储单元都趋于聚集在一个较小的连续区域
增设一个具有并行查找能力的高速缓冲存储器
存储频繁访问的页表项
4.4两级和多级页表
将原来一张大的页表分为多个页表
将地址组成部分的页表号分为多个部分
每多一个部分表示多出一个页表对其进行记录,就相当于形成了多表结构
实现可非连续存储页表
级别增多会导致访问次数的增多
每多一次页表会多一次对主存的访问
5.信息共享 多个进程页表项指向同一个物理块
6.可重入代码 纯代码, 允许多个进程访问但在执行过程中不可被修改
基本分段存储管理方式
程序会划分成不同大小的块
使用分块存储会便于编程
便于共享和保护
每个分段都从0开始编址并采用一段连续的地址空间
故段连续 段之间不连续
1.逻辑地址结构 :段号和段内地址
2.段表 :分段存储没有均匀分割 故应存在段号 段长 基址 存放和页表类似
段寄存器存放段表始址和段表长度
3.与分页的区别
页是信息的物理单位
页的大小固定而且由操作系统决定
地址是一维的
段是信息的逻辑单位
4.信息共享
多个进程的段表项指向同一内存区域实现
5.大小
逻辑地址结构
1.段号
通过段号可以知道最多允许有多少分段
2.段内地址
可以知道每段的最大长度
不定
段页式存储管理方式
结合分段的满足用户和分页的高效内存满足
先分成逻辑片段 再对片段进行分页的操作
1.逻辑地址结构
- 段号
- 段内页号
- 页内地址
2.先分段再分段
所以会先访问段表再访问页表
最后访问信息
3.段表和页表
硬件支持只要段表寄存器