循环首次适应算法(NF)
又称为下次适应算法,由首次适应算法演变而来的。
算法思想:
在为作业分配内存空间的时候,不再每次从空闲分区表/链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直到找到第一个能够满足其大小要求的空闲分区为止
然后再按照作业的大小,从该分区中划分出一块内存空间分配给请求者,余下的空闲分区仍然按照地址递增的次序保留在空闲分区表/链中
例题
例 :系统中的空闲分区表如下,现有三个作业申请分配内存空间100KB、30KB及7KB。给出按循环首次适应算法的内存分配情况及分配后空闲分区表。解:按循环首次适应算法,
申请作业100k,分配3号分区,剩下分区为20k,起始地址200K;
申请作业30k,分配4号分区,剩下分区为301k,起始地址350K ;
申请作业7k,分配1号分区,剩下分区为25k,起始地址27K ;
其内存分配图及分配后空闲分区表如下
循环首次适应算法的特点:
优点:
使存储空间的利用更加的均衡,不会让小的空闲区集中在存储区的一端
缺点:
会导致缺乏大的空闲分区
最佳适应算法(BF)
算法思想:
空闲分区表/链按容量大小递增的次序排列。
在进行内存分配时,从空闲分区表/链首开始顺序查找,直到找到第一个满足其大小要求的空闲分区为止
按照这种方式为作业分配内存就能把既满足作业要求又与作业大小最接近的空闲分区分配给作业。如果该空闲分区大于作业的大小,
则与首次适应算法相同,将剩余空闲分区仍按容量大小递增的次序保留在空闲分区表/链中。
例题
例:系统中的空闲分区表如下,现有三个作业申请分配内存空间100KB、30KB及7KB。给出按最佳适应算法的内存分配情况及分配后空闲分区表。
最佳适应算法特点
如果存在与作业大小一致的空闲分区,则它必然被选中,如果不存在与作业大小一致的空闲的分区,则只划分比作业稍大的空闲分区,从而保留了大的空闲分区,但是空闲区一般不可能正好和他申请的内存空间大小一样,因而将其分割成为两部分的时候,往往使剩下的空闲非常的小,从而在存储器中留下了许多难以利用的小空闲区。
优点:较大的空闲分区可以被保留
缺点:分割后的空闲区将会很小,直至无法使用,而造成浪费。
最坏适应算法(WF)
算法思想:
空闲分区表/链按容量大小递减的次序排列。
在进行内存分配的时候,从空闲分区表/链首开始顺序查找,找到第一个能够满足作业要求的空闲分区,一定是个最大的空闲区域。这样可以保证每次分割之后剩下的空闲分区不至于太小(还可被分配使用,以减少碎片),仍然把它按照从大到小的次序保留在空闲表/链中。
在进行内存分配的时候,从空闲分区表/链首开始顺序查找,找打第一个能够满足作业要求的空闲分区,一定是个最大的空闲区,这样可以保证每次分割后剩下的空闲分区不至于太小(还可以被分配使用,以减少碎片),扔把他按照从大到小的次序保留在空闲分区表/链当中
例题
例:系统中的空闲分区表如下,现有三个作业申请分配内存空间100KB、30KB及7KB。给出按最坏适应算法的内存分配情况及分配后空闲分区表。
解:按最坏适应算法,分配前的空闲分区表如下表。
申请作业100k,分配1号分区,剩下分区为231k,起始地址420K;
申请作业30k,分配1号分区,剩下分区为201k,起始地址450K ;
申请作业7k,分配1号分区,剩下分区为194k,起始地址457K ;
其内存分配图及分配后空闲分区表如下:
最坏适应算法的特点:
总是挑选满足作业要求的最大的分区分配给作业。这样使分给作业后剩下的空闲分区也较大,可装下其它作业。但由于最大的空闲分区总是因首先分配而划分,当有大作业到来时,其存储空间的申请往往会得不到满足。
优点:分配时,产生的空白区可供以后使用。只需查找一次,就可成功,分配算法很快
缺点:最后剩余分区会越来越小,无法运行大程序
快速适应算法(QF)
又称为分类搜索法
算法思想
将空闲分区根据容量大小进行分类,对于每一类具有相同容量的所有空闲分区,单独设立一个空闲分区(链)表,这样系统中存在多个空闲分区(链)表
同时在内存中设立一张管理索引表,每个表项对应了一种空闲分区类型,并指向该类型的空闲分区表的表头
快速适应算法特点
优点:
查找效率高,找到该类以后,取下第一块分配即可
不会对任何分区分割,能够保留大的分区
不会产生碎片
缺点:
分区归还给系统的时候算法复杂,系统开销大
一个分区只属于一个进程,内存空间存在一定的浪费
3、分区分配操作
在动态分区存储管理方式,主要的操作是分配内存和回收内存
分配内存
利用某种分配算法,从空闲分区链(表)中找到所需要的大小的分区。
设请求的分区大小为u.size
表中每个空闲分区的大小表示为m.size
若m.size-u.size<=size(事先规定的不再切割的分区大小),将整个分区分配给请求者,否则从分区中按照请求的大小划分出一块内存空间分配出去,余下的部分留在空闲链当中,将分配区首地址返回给调用者。
3.分区分配操作
回收内存
当作业执行结束的时候,释放所占有的内存空间,OS应回收已使用完毕的内存分区。
系统根据回收分区的大小以及首地址,在空闲分区表中检索是否有邻接的空闲分区,如果有,则合成为一个大的空闲分区,然后修改有关的分区状态信息
回收分区与已经有的空闲分区的相邻情况有以下四种:
回收区与前一个空闲分区相邻
回收分区与后一个空闲分区相邻
回收区同时与前后两个分区相邻
回收区前后都不邻空闲区
回收区与前一个空闲分区相邻
回收分区R上面邻接一个空闲分区F1,合并后首地址为空闲分区F1的首地址,大小为F1和R二者大小之和。
这种情况下,回收后空闲分区表中表项数不变。回收分区与后一空闲分区相邻
回收分区R下面邻接一个空闲分区F2,合并后首地址为回收分区R的首地址,大小为R和F2二者大小之和。
这种情况下,回收后空闲分区表中表项数不变。
回收区同时与前、后两个分区邻
回收分区R上下邻接空闲分区F1和F2,合并后首地址为上空闲分区F1的首地址,大小为F1、R和F2三者大小之和。
这种情况下,回收后空闲分区表中表项数不但没有增加,反而减少一项。
回收区前后都不邻空闲区
回收分区R不邻接空闲分区,这时在空闲分区表中新建一表项,并填写分区首地址、大小等信息。
这种情况下,回收后空闲分区表中表项数增加一项。
伙伴系统(不讲)
伙伴系统(不讲)
固定分区:限制了活动进程的数目,内存利用率低
动态分区:算法复杂,系统开销大
折中方案:伙伴系统
伙伴系统规定:已分配/空闲分区的大小都是2的k次幂(l≤k≤m)
分配和回收方法:P132
分配和回收的时间性能取决于查找空闲分区的位置和分割、合并空闲分区所花费的时间
在当前OS中,普遍采用虚拟内存机制(重点介绍)
在多处理机系统中,伙伴系统得到大量的应用
哈希算法(不讲)
分类搜索算法(快速适应算法)和伙伴系统的共同特点:将空闲分区根据分区大小进行分类,对于每一类具有相同大小的空闲分区,单独设立一个空闲分区链表。为进程分配内存空间时,需在一张管理索引表中查找所需空间大小所对应的表项,通过指针找到一个空闲分区。
哈希算法利用哈希快速查找的优点,以及空闲分区在可利用空间表中的分布规律,建立哈希函数,构造一张以空闲分区大小为关键字的哈希表,每一个表项记录了一个对应的空闲分区链链表表头指针。
进行分配时,根据所需空闲分区大小,通过哈希函数计算,得到在哈希表中的位置,找到相应的空闲分区链表,实现最佳分配策略。
可重定位分区分配
动态重定位的引入
连续分配存在的问题:必须把一个系统或用户程序装入一连续的内存空间。
如果在系统中只有若干个小的分区,即使它们容量的总和大于要装入的程序,但由于这些分区不相邻接,也无法把该程序装入内存。
必须有足够大的连续的空间才能够分配
这种内存中无法被利用的存储空间称为零头,或者碎片,根据碎片出现的情况分为以下的两种:
内部碎片
外部碎片
碎片
内部碎片:
指分配给作业的存储空间中未被利用的部分,如固定分区中存在的碎片
外部碎片:指系统中无法利用的小的空闲分区,如动态分区中存在的碎片
解决方法
若想把作业装入,可采用:将内存中所有的作业进行移动,使它们全都相邻接,即可把原来分散的多个小分区拼接成一个大分区,这时就可把作业装入该区。
这种将多个分散的小分区拼接成为一个大分区的方法,称为拼接或者紧凑
由于经过紧凑之后的某些用户程序在内存中的位置发生了变化,此时如果不对程序和数据的地址加以修改,额程序必将无法执行,为此,每次紧凑之后,都必须对移动了的程序和数据进行重定位
紧凑:通过移动一些内存分区,将原本离散的一些内存小碎片变得相邻,进而可以合并为一个稍大的空闲分区的技术。
现在有4个空闲分区,如果有一个大小为40KB的程序要求进入内存,如何处理?
动态重定位的实现
作业装入内存后的所有地址仍是相对地址,将相对地址转换成物理地址的工作在指令执行时进行
需要有硬件地址变换机构的支持,增加基地址寄存器
动态重定位示意图
动态重定位分区分配算法
动态重定位分区分配算法,与动态分区分配算法基本上相同;
差别仅在于:增加了“紧凑”功能,通常是在找不到足够大的空闲分区来满足用户需求时,进行紧凑。
紧凑时机:
在一个分区释放后立即移动
当请求得不到满足时再移动
动态重定位分区分配算法流程图
可重定位分区分配的特点:
优点:
解决了动态分区分配所引入的外部碎片的问题,消除了外部碎片,提高了内存的利用率,以便运行大作业,
缺点:提高了硬件成本,紧凑的时候花费CPU时间,紧凑系统的开销大
对换(swapping)
所谓“对换”,是指把内存中暂时不能运行的进程或者暂时不用的程序和数据,调出到外存上,以便腾出足够的内存空间,再把已具备运行条件的进程或进程所需要的程序和数据,调入内存。
对换是提高内存利用率的有效措施
对换的引入
矛盾:
在多道程序环境下,一方面,在内存中的某些进程由于某事件尚未发生而被阻塞运行,但它却占用了大量的内存空间,甚至有时可能出现在内存中所有进程都被阻塞而迫使CPU停止下来等待的情况;
另一方面:却又有着许多作业在外存上等待,因无内存而不能进入内存运行的情况。
解决方法:
引入了Swapping(对换)技术
实现方式:通过中级调度
为了实现进程对换,系统必须能够实现以下三个方面的功能:
1.对换空间的管理
2.进程的换出
3.进程的换入
对换的分类
对换根据对换对象的不同,又分为:
进程对换(或整体对换):以整个进程为单位进行的对换,应用于分时系统,目的是解决内存紧张的问题,以提高内存利用率
部分对换:又分为两种
页面对换:进程地址空间分为页,暂不用的页面可以淘汰出内存,需要时由缺页中断处理程序调入内存。
分段对换:进程地址空间分为段,暂不用的段可以淘汰出内存,需要时由缺段中断处理程序调入内存。
部分对换的目的是为了支持虚拟存储系统
对换空间的管理
在具有对换功能的OS中,通常把外存分为文件区和对换区,两者的区别如下表:
在系统中配置相应的数据结构以记录外存的使用情况,其形式与内存在动态分区分配方式中所用数据结构相似
对换空间的分配拟和回收,与动态分区方式时的内存分配与回收雷同,分配算法可以是首次适应算法,循环首次适应算法,最佳适应算法
进程的换入与换出
进程的换出
每当一进程由于创建子进程而需要更多的内存空间,但又无足够的内存空间等情况发生时,系统应将某进程换出。其过程是:
系统选择处于“阻塞”状态且优先级最低的进程作为换出进程
然后启动磁盘,将该进程的程序和数据传送到磁盘的对换区上
若传送过程未出现错误,便回收其所占用的内存空间,并对该进程的进程控制块做相应的修改
进程的换入
系统应定时地查看所有进程的状态,从中找出“就绪”状态但已换出的进程,将其中换出时间最久(换出到磁盘上) 的进程作为换入进程,将之换入,直至已无可换入的进程或无可换出的进程为止
4.4 基本分页存储管理方式
基本分页存储管理方式
连续分配存储管理方式产生的问题
在分区存储管理中,要求把进程放在一个连续的存储区中,因而会产生许多碎片。
碎片问题的解决方法:
拼接/紧凑技术–代价较高
离散分配方式–允许将作业/进程离散放到多个不相邻接的分区中,就可以避免拼接,基于这一思想产生了一下的离散分配方式:
分页式存储管理:离散分配的基本单位是页
分段式存储管理:离散分配的基本单位是段
在分页存储管理方式中,如不具备页面对换功能,则不支持虚拟存储器功能,在调度作业运行时,必须将它的所有页面一次调入内存,这种存储管理方式称为纯分页或基本分页存储管理方式。