操作系统理论 第四章(存储器管理)—第三节(连续分配存储管理方式)

写在前面:

  1. 本系列笔记主要以《计算机操作系统(汤小丹…)》为参考,大部分内容出于此书,笔者的工作主要是挑其重点展示,另外配合下方视频链接的教程展开思路,在笔记中一些比较难懂的地方加以自己的一点点理解(重点基本都会有标注,没有任何标注的难懂文字应该是笔者因为强迫症而加进来的,可选择性地忽略)。
  2. 视频链接:操作系统(汤小丹等第四版)_哔哩哔哩_bilibili

一、单一连续分配

        连续分配方式是指为一个用户程序分配一个连续的内存空间。

        单一连续分配方式把内存分为系统区和用户区两部分系统区仅提供给OS使用,通常放在内存低址部分,用户区是指除系统区以外的全部内存空间,提供给用户使用在用户区内存中仅装有一道用户程序,即整个内存的用户空间由该程序独占。

        单一连续分配方式的优点是实现简单,无外部碎片外部碎片指的是内存中的空闲分区由于太小而难以利用),可以采用覆盖技术扩充内存,不一定需要采取内存保护。单一连续分配方式的缺点是只能用于单用户、单任务的操作系统中,而且有内部碎片内部碎片指的是一个分区分配给一个程序后,自身还有大量空闲空间不能利用),存储器利用率极低。

二、固定分区分配

1、具体分配方法

        固定分区分配将内存用户空间划分为若干个固定大小的区域,在每个分区中只装入一道作业,便可以有多道作业并发执行。当有一空闲分区时,便可以再从外存的后备作业队列中选择一个适当大小的作业装入该分区,当该作业结束时,可再从后备作业队列中找出另一作业调入该分区。

2、划分分区的方法

(1)分区大小相等(指所有的内存分区大小相等)。对于利用一台计算机同时控制多个相同对象的场合,因为这些对象所需的内存空间大小往往相同,这种划分方式比较方便和实用,所以被广泛采用。

(2)分区大小不等,把内存区划分成含有多个较小的分区、适量的中等分区及少量的大分区。这样可根据程序的大小,为之分配适当的分区。

3、固定分区分配的实现

(1)为便于内存分配,通常将分区按大小进行排队,并为之建立一张分区使用表,其中包括每个分区的起始地址、大小及状态是否已分配

(2)当有一用户程序要装入时,由内存分配程序检索该表,从中找出一个能满足要求的、尚未分配的分区,将之分配给该程序,然后将该表项中的状态置为“已分配”;若未找到大小足够的分区,则拒绝为该用户程序分配内存。

4、固定分区分配的优点及存在的问题

(1)优点:实现简单,无外部碎片

(2)存在的问题——缺乏灵活性,主存利用率低

①当程序小于固定分区大小时,占用了一个完整的内存分区空间,这样分区内部有空间浪费,这种现象称为内部碎片。

②当程序大于固定分区大小时,一个分区又不足以装入该程序,致使该程序无法运行,这时用户不得不使用覆盖技术来使用内存空间。

三、动态分区分配

1、具体分配方法

        动态分区分配是指根据进程的实际需要,动态地为之分配内存空间。作业装入内存时,把可用内存分出一个连续区域给作业,且分区的大小正好适合作业大小的需要。

2、动态分区分配中的数据结构

(1)空闲分区表:用于记录每个空闲分区的情况,每个空闲分区占一个表目,表目中包括分区号、分区大小和分区始址等数据项。

(2)空闲分区链:在每个分区的起始部分设置一些用于控制分区分配的信息,以及用于链接各分区所用的前向指针,在分区尾部则设置一后向指针,通过前、后向链接指针,可将所有的空闲分区链接成一个双向链。

3、动态分区分配算法

(1)为把一个新作业装入内存,需按照一定的分配算法,从空闲分区表或空闲分区链中选出一分区分配给该作业。

(2)常用的分配算法有首次适应算法、循环首次适应算法、最佳适应算法、最坏适应算法、快速适应算法等。

①首次适应算法(FF):

        FF算法要求空闲分区表(链)以地址递增的次序排列。在分配内存时,从表(链)首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止,然后按照作业的大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲分区表(链)中;若从头到尾不存在满足要求的分区,则分配失败。

        该算法倾向于优先利用内存中低址部分的空闲分区,从而保留了高址部分的大空闲区。其缺点是低址部分不断被划分,会留下许多难以利用的、很小的空闲分区,称为碎片,另外每次查找又都是从低址部分开始的,这无疑又会增加查找可用空闲分区时的开销。

②循环首次适应算法(NF):

        在分配内存空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业

        为实现该算法,应设置一起始查寻指针,用于指示下一次起始査寻的空闲分区,并采用循环查找方式,如果最后一个(链/表尾)空闲分区的大小仍不能满足要求,则应返回到第一个空闲分区,比较其大小是否满足要求,找到后,应调整起始查寻指针。

        该算法能使内存中的空闲分区分布得更均匀,从而减少了查找空闲分区时的开销,但这样会缺乏大的空闲分区。

③最佳适应算法(BF):

        所谓“最佳”是指每次为作业分配内存时,总是把能满足要求、又是最小的空闲分区分配给作业,避免“大材小用”。

        该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链,这样,第一次找到的能满足要求的空闲分区必然是最佳的。

        该算法的缺点是在存储器中会留下许多难以利用的碎片。

④最坏适应算法(WF):

        最坏适应分配算法要扫描整个空闲分区表或链表,总是挑选一个最大的空闲区,从中分割一部分存储空间给作业使用

        该算法要求将所有的空闲分区按其容量以从大到小的顺序形成一空闲分区链,查找时只要看第一个分区能否满足作业要求。

        它的优点是可使剩下的空闲区不至于太小,产生碎片的可能性最小,对中、小作业有利,同时,最坏适应分配算法查找效率很高,因为该算法要求将所有的空闲分区按其容量以从大到小的顺序形成一空闲分区链,所以查找时只要看第一个分区能否满足作业要求即可。

⑤快速适应算法:

        该算法又称为分类搜索法,是将空闲分区根据其容量大小进行分类,对于每一类具有相同容量的所有空闲分区,单独设立一个空闲分区链表,系统中存在多个空闲分区链表,同时在内存中设立一张管理索引表,该表的每一个表项对应了一种空闲分区类型,并记录了该类型空闲分区链表表头的指针。

        该算法在搜索可分配的空闲分区时分为两步:第一步是根据进程的长度,从索引表中去寻找到能容纳它的最小空闲区链表;第二步是从链表中取下第一块进行分配即可。另外,该算法在进行空闲分区分配时,不会对任何分区产生分割,所以能保留大的分区,满足对大空间的需求,也不会产生内存碎片。

        该算法优点是查找效率高。该算法的主要缺点在于为了有效合并分区,在分区归还主存时的算法复杂,系统开销较大;此外,该算法在分配空闲分区时,是以进程为单位的,一个分区只属于一个进程,因此在为进程所分配的一个分区中,或多或少地存在一定的浪费,这是典型的以空间换时间的做法。

4、分区分配及回收操作

(1)分配内存:

        利用某种分配算法,从空闲分区链(表)中找到所需大小的分区。设请求的分区大小为u.size,表中每个空闲分区的大小表示为m.size,若m.size- u.size≤size(规定的不再切割的分区大小),将整个分区分配给请求者,否则从分区中按请求的大小划出一块内存空间分配出去,余下部分留在空闲链中,然后将分配区首址返回给调用者。

(2)回收内存:

        当进程运行完毕释放内存时,系统根据回收区的首址,从空闲分区链(表)中找到相应的插入点,此时可能出现以下四种情况之一:

        ①回收区与插入点的前一个空闲分区F_{1}相邻接(对应下一图):此时应将回收区与插入点的前一分区合并,不必为回收分区分配新表项,而只需修改其前一分区F_{1}的大小。

        ②回收区与插入点的后一个空闲分区F_{1}相邻接(对应下二图):此时也可将两分区合并,形成新的空闲分区,但用回收区的首址作为新空闲区的首址,大小为两者之和。

        ③回收区同时与插入点的前、后两个分区邻接(对应下三图):此时将三个分区合并,使用F_{1}的表项和F_{1}的首址,取消F_{2}的表项,大小为三者之和。

        ④回收区既不与F_{1}邻接,又不与F_{2}邻接:这时应为回收区单独建立一个新表项,填写回收区的首址和大小,并根据其首址插入到空闲链中的适当位置。

四、动态可重定位分区分配

1、紧凑

(1)连续分配方式的一个重要特点是,一个系统或用户程序必须被装入一片连续的内存空间中。当一台计算机运行了一段时间后,它的内存空间将会被分割成许多小的分区,而缺乏大的空闲空间,即使这些分散的许多小分区的容量总和大于要装入的程序,但由于这些分区不相邻接,也无法把该程序装入内存。

(2)为了解决上述问题,可以将内存中的所有作业进行移动,使它们全部邻接,这样把原来分散的小分区拼接成大分区,这种方法称为拼接紧凑

(3)虽然“紧凑”能获得大的空闲空间,但也带来了新的问题,即经过紧凑后的用户程序在内存中的位置发生了变化,此时若不对程序和数据的地址加以修改(变换),则程序必将无法执行。为此,在每次紧凑后都必须对移动了的程序或数据进行重定位

2、动态重定位

(1)在动态运行时装入的方式中,将相对地址转换为物理地址的工作在程序指令真正要执行时才进行,而地址转换需要重定位寄存器的支持。地址变换过程是在程序执行期间随着对每条指令或数据的访问自动进行的,故称为动态重定位。

(2)程序执行时访问的内存地址是相对地址与重定位寄存器中的地址相加而成

(3)动态重定位的特点是可以将程序分配到不连续的存储区中,在程序运行之前可以只装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存。这种算法便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。

(4)当系统对内存进行了“紧凑”,而使若干程序从内存的某处移至另一处时,不需对程序做任何修改,只要用该程序在内存的新起始地址去置换原来的起始地址即可。

3、动态重定位分区分配方法

        动态重定位分区分配算法与动态分区分配算法基本相同,差别在于增加了紧凑的功能。通常,当该算法不能找到一个足够大的空闲分区以满足用户需求时,如果所有的小的空闲分区的容量总和大于用户的要求,这时便须对内存进行“紧凑”,将经“紧凑”后所得到的大空闲分区分配给用户;如果所有的小的空闲分区的容量总和仍小于用户的要求,则返回分配失败信息。

五、存储保护

        内存分配前,需要保护操作系统不受用户进程的影响,同时保护用户进程不受其它用户进程的影响。内存保护可采取两种方法:

        (1)在CPU中设置一对上、下限寄存器,存放用户作业在主存中的下限和上限地址,每当CPU要访问一个地址时,分别和两个寄存器的值相比,判断有无越界。

        (2)通过采用重定位寄存器(或基址寄存器)和界地址寄存器(又称限长寄存器)来实现这种保护。重定位寄存器含最小的物理地址值,界地址寄存器含逻辑地址的最大值。每个逻辑地址值必须小于界地址寄存器;内存管理机构动态地将逻辑地址与界地址寄存器进行比较,如果未发生地址越界,则加上重定位寄存器的值后映射成物理地址,再送交内存单元。

  • 31
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
通用动态分区分配存储器管理系统是一个操作系统的重要组成部分,其主要作用是管理计算机的内存资源,有效地分配和回收内存空间,以满足系统的运行需求。以下是一个简单的通用动态分区分配存储器管理系统的设计: 1. 内存分区管理 系统需要维护一个内存分区表,记录可用和已分配的内存分区的信息。每个内存分区表项包括以下信息: - 分区大小 - 起始地址 - 是否已分配 系统需要实现内存分区分配和回收操作。分配操作根据分配请求的大小,从可用分区中选择合适的分区进行分配。回收操作将已分配分区释放,并将该分区标记为可用。 2. 内存分配算法 系统需要实现不同的内存分配算法,以满足不同的应用场景需求。常见的内存分配算法包括: - 首次适应算法:按照分区起始地址从低到高的顺序查找,找到第一个符合大小要求的空闲分区进行分配。 - 最佳适应算法:按照分区大小从小到大的顺序查找,找到最小的符合大小要求的空闲分区进行分配。 - 最坏适应算法:按照分区大小从大到小的顺序查找,找到最大的符合大小要求的空闲分区进行分配。 3. 内存碎片整理 随着内存的不断分配和回收,可能会产生很多小的空闲分区,导致内存碎片化。系统需要实现内存碎片整理算法,将多个小的空闲分区合并成一个大的空闲分区,以充分利用内存资源。 4. 进程内存管理 对于每个进程,系统需要维护其内存使用情况,包括已分配的内存大小和起始地址。当进程需要更多内存时,系统需要为其分配新的内存分区,当进程不需要某些内存时,系统需要回收这些内存分区。 5. 内存保护 系统需要实现内存保护机制,防止一个进程越界访问另一个进程的内存空间,或者访问操作系统的内存空间。系统可以通过硬件机制(如MMU)或软件机制(如地址转换和访问权限控制)来实现内存保护。 以上是一个简单的通用动态分区分配存储器管理系统的设计。实现这个系统需要考虑各种不同的情况和应用场景,需要仔细设计和测试,确保其稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zevalin爱灰灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值