课堂笔记学习视频来自 操作系统
说明:其他”课堂问答笔记“也在”操作系统“专栏
【4-2】
本节课课后讨论汇总:
-
动态分区分配算法和固定分区分配算法的区别?4种动态分区分配算法各自的优缺点?
答:固定分区分配是在处理作业之前存储器就已经被划分成若干个分区,每个分区的大小可以相同,也可以不同。但是,一旦划分好分区后,内存中的分区的个数就固定了,且每个分区的大小固定不变(利用分区说明表来管理所有的这些分区,表中的状态那一列用来表明该分区是否已分配给某个作业)。
动态分区分配在每次装入作业时采用某种算法动态地为作业从可用内存中划分出一个分区。因此,内存中空闲分区(注意是空闲分区)的个数和每个空闲分区的大小将随着系统中运行的作业情况而变化(利用空闲分区表来管理这些空闲分区,表中所有的分区都是未分配的,即空闲的(注:空闲分区表中不包含已经分配的分区)。当给某个作业分配一个空闲分区时,有可能要把该空闲分区从表中移出,也可能把该空闲分区的剩余部分保留在表中);另外动态分区分配算法还涉及当某个作业完成后内存回收的问题(某个作业完成后其占用的内存又变成空闲,需要重新加入到空闲分区表中)。
固定分区分配方式存在内部碎片,而动态分区分配方式存在外部碎片。
1)首次适应算法(First Fit):将空闲分区链以地址递增的顺序连接;在进行内存分配时,从链首开始顺序查找,直到找到一块分区的大小可以满足需求时,按照该作业的大小,从该分区中分配出内存,将剩下的空闲分区仍然链在空闲分区链中。
优点:高址部分的大的空闲分区得到保留,为大作业的内存分配创造了条件;
缺点:每次都是优先利用低址部分的空闲分区,造成低址部分产生大量的外部碎片;每次都是从低址部分查找,使得查找空闲分区的开销增大。
2)循环首次适应算法(Next Fit):分配内存时不是从链首进行查找可以分配内存的空闲分区,而是从上一次分配内存的空闲分区的下一个分区开始查找,直到找到可以为该进程分配内存的空闲分区;
优点:使得空闲分区分布更加均匀;空闲分区的查找开销小;
缺点:高址部分的大空闲分区被分小,使得大作业进入无法分配内存。
3)最佳适应算法(Best Fit):将空闲分区链中的空闲分区按照空闲分区由小到大的顺序排序,从而形成空闲分区链。每次从链首进行查找合适的空闲分区为作业分配内存,这样每次找到的空闲分区是和作业大小最接近的,所谓“最佳”。
优点:第一次找到的空闲分区是大小最接近待分配内存作业大小的;
缺点:产生大量难以利用的外部碎片。
4)最坏适应算法(Worst Fit):与最佳适应算法刚好相反,将空闲分区链的分区按照从大到小的顺序排序形成空闲分区链,每次查找时只要看第一个空闲分区是否满足即可。
优点:效率高,分区查找方便;
缺点:当小作业把大空闲分区分小了,那么,大作业就找不到合适的空闲分区。 -
动态分区分配算法存在几种内存回收的问题?
答:当用户作业或进程执行结束时,存储管理程序要收回已使用完毕的空闲区,并将其插入空闲分区表或空闲分区链中。
在将一个新空闲分区插入空闲分表或空闲分区链时,该空闲区和上下相邻区的关系是下述4种关系之一:
1)该空闲分区的上下两相邻分区都是空闲区:将三个空闲区合并为一个空闲区。新空闲区的起始地址为上空闲区的起始地址,大小为三个空闲区之和。空闲区合并后,取消空闲分区表或空闲分区链中下空闲区的表目项,修改上空闲区的对应项(主要是修改空闲分区大小)。
2)该空闲分区的上相邻区是空闲区:将释放区与上空闲区合并为一个空闲区,其起始地址为上空闲区的起始地址,大小为上空闲区与释放区之和。合并后,修改上空闲区对应的空闲分区表的表目项(主要是修改空闲分区大小)。
3)该空闲分区的下相邻区是空闲区:将释放区与下空闲区合并,并将释放区的起始地址作为合并区的起始地址、合并区的长度为释放区与下空闲区之和(修改下空闲区对应的空闲分区表的表目项)。
4)上下两相邻区都不是空闲分区:释放区作为一个新空闲空闲分区插入空闲分区表或空闲分区链中(即空闲分区表或空闲分区链中增加一项)。
第1种表中要删除1项(删除下空闲区);第2,3种表中要修改1项(第2种修改上空闲区,第3种修改下空闲区);第4种表中要添加1项。 -
动态可重定位分区分配有解决碎片问题吗?
答:在连续分配方式中,必须把一个系统或用户程序装入一连续的内存空间。如果在系统中只有若干个小的分区,即使它们的容量总和大于要装入的程序,但由于这些分区不相邻接,也无法把该程序装入内存。这种不能被利用的小分区称为“零头”或“碎片”。通过移动内存中作业的位置,然后把原来多个分散的空闲小分区拼接成一个大分区的方法,称为“拼接”或“紧凑”。所谓拼接是指移动内存中所有已分配区到内存的一端,使本来分散的小空闲区连成一个大的空闲区。因此能够有效解决前面的分配算法产生的碎片问题。
由于经过紧凑后的某些用户程序在内存中的位置发生了变化,此时若不对程序和数据的地址加以修改(变换),则程序必将无法执行。为此,在每次“紧凑”后,都必须对移动了的程序或数据进行重定位(该算法名称中的“可重定位”就是指这个意思)。 -
简要描述对换技术的原理?
答:在多道程序环境下,可能会有如下两个问题:
1)内存中的某些进程可能被阻塞(由于等待I/O或其他原因),但是该进程占用了大量的内存空间,甚至会发生内存中所有的进程都被阻塞的情况。
2)在上述情况下,还有些作业在外存上等待调入内存,但因内存空间已被那些阻塞的进程占用所以这些在外存上等待的作业无法被调入内存执行。
对换技术是把内存中暂时不能运行的进程或暂时不用的程序或数据,调出到外存上,以便腾出足够的内存空间,再把具备运行条件的进程或进程所需要的程序和数据调入内存。对换分为如下三类:
进程对换(整体对换):以进程为单位进行对换。
页面对换(部分对换):以页面为单位进行对换。
分段对换(部分对换):以分段为单位进行对换。
有关分页、分段是下节课的内容。对换技术是实现虚拟存储器的基础(注:虚拟存储器是本章最后的内容,教材安排在下一章)。 -
简要描述伙伴系统?
答:伙伴系统是从快速适应(Quick Fit)算法发展过来的。
快速适应(quick fit)算法:又称为分类搜索法,是将空闲分区根据其容量大小进行分类,对于每一类具有相同容量的所有空闲分区,单独设立一个空闲分区链表,这样,系统中存在多个空闲分区链表,同时在内存中设立一张管理索引表,该表的每一个表项对应了一种空闲分区类型,并记录了该类型空闲分区链表表头的指针。空闲分区的分类是根据进程常用的空间大小进行划分,如2KB、4KB、8KB 等,对于其它大小的分区,如7KB这样的空闲区,既可以放在8KB 的链表中,也可以放在一个特殊的空闲区链表中。该算法的优点是查找效率高,仅需要根据进程的长度,寻找到能容纳它的最小空闲区链表,并取下第一块进行分配即可。另外该算法在进行空闲分区分配时,不会对任何分区产生分割,所以能保留大的分区,满足对大空间的需求,也不会产生内存碎片。但算法复杂,系统开销较大。
伙伴系统(buddy system)把系统中要管理的物理内存按照页面个数分为不同的组,每组中的内存块大小都相等,为2的幂次个物理页。
当分配内存时,会优先从需要分配的内存块链表上查找空闲内存块,当发现对应大小的内存块都已经被使用后,那么会从更大一级的内存块上分配一块内存,并且分成一半给我们使用,剩余的一半释放到对应大小的内存块链表上。比如我们申请一个8KB大小的内存,但是发现对应大小的内存已经没有了(当然如果存在就直接分配了,也就没有后面的事了),那么伙伴系统会从16KB的链表中查找一个空闲内存块,分成两个8KB大小,把其中的一个8KB大小返回给申请者使用,剩下的8KB放到8KB对应的内存块链表中进行管理。更坏的一种情况是,系统发现16KB大小的连续内存页已经没有了,那么以此会向更高的32KB链表中查找,如果找到了空闲内存块,那么就把32KB分成一个16KB和两个8KB,16KB的内存块放到16KB的链表进行管理,两个8KB的内存块一个返回给申请者,另一个放到8KB大小的链表进行管理。
当释放内存时,会扫描对应大小的内存块链表,查看是否存在地址能够连续在一起的内存块,如果发现有,那么就合并两个内存块放置到更大一级的内存块链表上,以此类推。比如我们释放8KB大小的内存,那么会从对应的链表扫描是否有能够合并的内存块,如果有另一个8KB大小的内存和当前释放的内存地址连续,那么就合并它们组成一个16KB大小的内存块,然后接着扫描16KB大小的内存块链表,继续查找合并的可能,以此类推下去。当然如果没有另一个8KB大小的内存和当前释放的内存地址连续,那么直接添加这部分空间放到8KB对应的内存块链表中进行管理。