1、操作系统内存管理操作系统内存管理1. 内存管理方法 内存管理主要包括虚地址、地址变换、内存分配和回收、内存扩充、内存共享和保护等功能。 2. 连续分配存 储管理方式连续分配是指为一个用户程序分配连续的内存空间。 连续分配有单一连续存储管理和分区式储管理两种方式。2.1单一连续存储管理在这种管理方式中,内存被分为两个区域:系统区和 用户区。应用程序装入到用户区,可使用用户区全部空间。 其特点是,最简单,适用于单用户、单任务的操作系统。 CP M 和 DOS20 以下就是采用此种方式。 这种方式的最大优点就是易于 管理。但也存在着一些问题和不足之处,例如对要求内存空 间少的程序,造成内存浪费;程序
2、全部装入,使得很少使用的程序部分也占用定数量的内存 2.2 分区式存储管理为了支持多道程序系统和分时系统,支持多个程序 并发执行,引入了分区式存储管理。分区式存储管理是把内 存分为一些大小相等或不等的分区,操作系统占用其中一个 分区,其余的分区由应用程序使用,每个应用程序占用一个 或几个分区。分区式存储管理虽然可以支持并发,但难以进 行内存分区的共享。分区式存储管理引人了两个新的问题:内碎片和外 碎片。内碎片是占用分区内未被利用的空间,外碎片是占用 分区之间难以利用的空闲分区 (通常是小空闲分区 )。为实现分区式存储管理,操作系统应维护的数据结 构为分区表或分区链表。表中各表项一般包括每个分区
3、的起 始地址、大小及状态 (是否已分配 ) 。分区式存储管理常采用的一项技术就是内存紧缩(compaction) 。2.2.1固定分区 (nxedpartitioning) 。固定式分区的特点是把内存划分为若干个固定大 小的连续分区。分区大小可以相等:这种作法只适合于多个 相同程序的并发执行 (处理多个类型相同的对象 )。分区大小 也可以不等:有多个小分区、适量的中等分区以及少量的大 分区。 根据程序的大小, 分配当前空闲的、 适当大小的分区。优点:易于实现,开销小。缺点主要有两个:内碎片造成浪费;分区总数固定, 限制了并发执行的程序数目。2.2.2动态分区 (dynamic partitio
4、ning) 。动态分区的特点是动态创建分区:在装入程序时按 其初始要求分配,或在其执行过程中通过系统调用进行分配 或改变分区大小。 与固定分区相比较其优点是: 没有内碎片 但它却引入了另一种碎片外碎片。动态分区的分区分配 就是寻找某个空闲分区,其大小需大于或等于程序的要求。若是大于要求,则将该分区分割成两个分区,其中一个分区 为要求的大小并标记为“占用” ,而另一个分区为余下部分 并标记为“空闲” 。分区分配的先后次序通常是从内存低端 到高端。动态分区的分区释放过程中有一个要注意的问题 是,将相邻的空闲分区合并成一个大的空闲分区。下面列出了几种常用的分区分配算法:最先适配法 (nrst-fit
5、) :按分区在内存的先后次序从头 查找,找到符合要求的第一个分区进行分配。该算法的分配 和释放的时间性能较好,较大的空闲分区可以被保留在内存 高端。但随着低端分区不断划分会产生较多小分区,每次分 配时查找时间开销便会增大。下次适配法 (循环首次适应算法 next fit) :按分区在 内存的先后次序,从上次分配的分区起查找 (到最后 区时再从头开始 ,找到符合要求的第一个分区进行分配。该算法 的分配和释放的时间性能较好,使空闲分区分布得更均匀, 但较大空闲分区不易保留。最佳适配法 (best-fit) :按分区在内存的先后次序从头 查找,找到其大小与要求相差最小的空闲分区进行分配。从个别来看,
6、外碎片较小;但从整体来看,会形成较多外碎片 优点是较大的空闲分区可以被保留。最坏适配法 (worst- fit) :按分区在内存的先后次序从 头查找,找到最大的空闲分区进行分配。基本不留下小空闲 分区,不易形成外碎片。但由于较大的空闲分区不被保留, 当对内存需求较大的进程需要运行时,其要求不易被满足。2.3 伙伴系统固定分区和动态分区方式都有不足之处。固定分区 方式限制了活动进程的数目,当进程大小与空闲分区大小不 匹配时,内存空间利用率很低。动态分区方式算法复杂,回 收空闲分区时需要进行分区合并等,系统开销较大。伙伴系 统方式是对以上两种内存方式的一种折衷方案。伙伴系统规定,无论已分配分区或空
7、闲分区,其大小均为2的k次幕,k为整数,I k m,其中:2A1表示分配的最小分区的大小,2Am表示分配的最大分区的大小,通常2Am是整个可分配内存的大小假设系统的可利用空间容量为 2“m个字,则系统开始运行时, 整个内存区是一个大小为 2Am 的空闲分区。 在系统运行过中, 由于不断的划分,可能会形成若干个不 连续的空闲分区,将这些空闲分区根据分区的大小进行分 类,对于每一类具有相同大小的所有空闲分区,单独设立一 个空闲分区双向链表。 这样,不同大小的空闲分区形成了 k(0 k m)个空闲分区链表。分配步骤:当需要为进程分配一个长度为 n 的存储空间时 :首先计算一个i值,使2A(i - 1
8、) <n 2Ai ,然后在空闲分区大小为 2Ai 的空闲分区链表中查找。若找到,即把该空闲分区分配给进程。否则, 表明长度为 2Ai 的空闲分区已经耗尽, 则在分区大小为2A(i + 1)的空闲分区链表中寻找若存在2A(i + 1)的一个空闲分区,则把该空闲分区分 为相等的两个分区,这两个分区称为一对伙伴,其中的一个 分区用于配, 而把另一个加入分区大小为 2Ai 的空闲分区 链表中。若大小为 2A(i 1)的空闲分区也不存在, 则需要查找大小为 2A(i 2)的空闲分区, 若找到则对其进行两次分割:第一次,将其分割为大小为 2A(i + 1)的两个 分区,一个用于分配,一个加入到大小为
9、 2A(i + 1)的空闲分区链表中;第二次,将第一次用于分配的空闲区分割为2Ai 的两个分区,一个用于分配,一个加入到大小为 2Ai 的 空闲分区链表中。若仍然找不到,则继续查找大小为 2A(i + 3)的空闲分区,以此类推。由此可见, 在最坏的情况下, 可能需要对 2Ak 的空闲分区进行 k 次分割才能得到所需分区。与一次分配可能要进行多次分割一样,一次回收也可能要进行多次合并,如回收大小为 2Ai的空闲分区时,若事先已存在2Ai的空闲分区时,则应将其与伙伴分区合并为大 小为 2Ai1 的空闲分区,若事先已存在 2Ai1 的空闲分区 时,又应继续与其伙伴分区合并为大小为 2Ai + 2的空
10、闲分区,依此类推。在伙伴系统中,其分配和回收的时间性能取决于查 找空闲分区的位置和分割、合并空闲分区所花费的时间。与 前面所述的多种方法相比较,由于该算法在回收空闲分区 时,需要对空闲分区进行合并,所以其时间性能比前面所述 的分类搜索算法差,但比顺序搜索算法好,而其空间性能则 远优于前面所述的分类搜索法,比顺序搜索法略差。 需要 指出的是,在当前的操作系统中,普遍采用的是下面将要讲 述的基于分页和分段机制的虚拟内存机制,该机制较伙伴算 法更为合理和高效,但在多处理机系统中,伙伴系统仍不失 为一种有效的内存分配和释放的方法,得到了大量的应用。2.4 内存紧缩内存紧缩:将各个占用分区向内存一端移动
11、,然 后将各个空闲分区合并成为一个空闲分区。这种技术在提供了某种程度上的灵活性的同时,也 存在着一些弊端,例如:对占用分区进行内存数据搬移占用 CPU 时间;如果对占用分区中的程序进行“浮动” ,则其重 定位需要硬件支持。紧缩时机:每个分区释放后,或内存分配找不到 满足条件的空闲分区时。图 8.12堆结构的存储管理的分配算法: 在动态存储过程中,不管哪个时刻,可利用空间都是-一个地址连续的存储区,在编译程序中称之为 堆 ,每次分配都是从这个可利用空间中划出一块。其实现办法是:设立 一个指針,称之为堆指针,始终指向堆的最低(或锻联)地 址。当用户申请 N 个单位的存储块时,堆指针向高地址(或 低
12、地址) 称动 N 个存储单位, 而移动之前的堆指针的值就是 分配给用户的占用块的初始地址。例如,某个串处理系统中 有 A 、B 、C、D 这 4 个串,其串值长度分别為 12,6,10 和 8. 假 设堆指针 free 的初值为零,则分配给这 4 个串值的存储空间 的初始地址分别为 0.12.18 和28,如图8.12(a)和(b)所示,分配后的堆指针的值为 36。因此,这种堆结构的存储管理的分配算法非常简单,释放内存空间执行内存紧缩:回收用户释放的空闲块就比较麻烦 .由于系统的可利用空间始终是一个绝址连续的存储块,因此回收时必须将所释 放的空间块合并到整个堆上去才 能重新使用,这就是 存储
13、策缩的任务 .通常,有两种做法:一种是一旦有用户释放存储块即进行回收紧缩,例始,图8.12 (a)的堆,在c串释放存储块时即回收紧缩,例如 图8.12 (c)的堆,同时修改串的存储映像成图 8.12(d)的状态;另一种是在程序执行过程中不回收用户随时释放的存 储块,直到可利用空同不够分配或堆指针指向最高地址时才 进行存储紧缩。此时紧缩的目的是将堆中所有的空间块连成 一块,即将所有的占用块部集中到 可利用空间的低地地区, 而剩余的高地址区成为一整个地继连续的空闲块,如图 8.13 所示,其中(a)为紧缩前的状态,(b)为紧缩后的状态图 8.13 a 紧缩前 b 紧缩后和无用单元收集类似,为实现存
14、储紫编 ,首先要对占 用块进行“标志” ,标志算法和无用单元收集类同 (存储块的 结构可能不同) ,其次需进行下列 4 步雄作:( 1)计算占用块的新地址。从最低地址开始巡査整个 存储空间,对每一个占用块找到它在紧缩后的新地址。 为 此,需设立两个指针随巡查向前移动 ,这两个指针分别指示占 用 块在紧缩之前和之后的原地址和新地址。因此 ,在每个占用块的第-个存储单位中,除了 设立长度域(存储该占用换 的大小)和标志域 (存储区别该存储块是占用块或空闲块的标 志)之外,还需设立一个新地址城,以存储占用块在紧缩后 应有的新地址,即建立一张新, 旧地址的对照表 m(2)修改用户触初始变量表,以便在存
15、储紧缩后用户 程序能继续正常运行 * 。(3)检查每个占用块中存储的数据, 若有指向其他存 储换的指针,则需作相应修改 .(4)将所有占用块迁移到新地址走,这实质上是作传 送数据的工作。至此,完成了存储紧缩的操作,最后 ,将堆指针赋以 新值(即紧缩后的空闲存储区的最低地址) 。可见 ,存储紧缩法比无用单元收集法更为复杂,前者 不仅要传送数据(进行占用块迁移) ,而且还有需要修改所 有占用块中的指针值。因此,存储紧缩也是个系统操作,且 非不得已就不用。3. 覆盖和交换技术3.1 覆盖技术引入覆盖 (overlay) 技术的目标是在较小的可用内 存中运行较大的程序。这种技术常用于多道程序系统之中, 与分区式存储管理配合使用。覆盖技术的原理:一个程序的几个代码段或数据段, 按照时间先后来占用公共的内存空间。 将程序必要部分 (常用 功能 )的代码和数据常驻内存;可选部分 (不常用功能 )平时存 放在外存 (覆盖文件 )中,在需要时才装入内存。不存在调用 关系的模块不必同时装入到内存,从而可以相互覆盖。在任何时候只在内存中保留所需的指令和数据;当 需要其它指令时,它们会装入到刚刚不再需要的指令所占用 的内存空间;如在同一时刻, CPU 只能执行 B,C 中某一条。 B, C 之间就可以做覆盖。覆盖技术的缺点是编程时必须划分程序模块和确定程序模块之间的覆盖关系,增
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1