第四章存储管理

一。分区分配算法详解
 1. 首次适应算法(First Fit)
  以空闲分区链为例进行说明,FF算法要求空闲分区链以地址递增的次序链接,在分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止,然后再按照作业的大小,从该分区划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲链中,若从链首直至链尾都不能找到一个能满足要求的分区,则此次内存分配失败,返回。该算法倾向于优先利用内存中低址部分的空闲分区,从而保留了高址部分的大空闲区,这给以后达到的大作业分配大的内存空闲创造了条件,缺点在与低地址空间不断被划分,会留下许多难以利用的、很小的空闲分区,而每次查找又都是从低地址部分开始,这无疑会增加查找可用空闲分区的开销。
  2. 循环首次适应算法(Next Fit)

由首次适应算法演变而来,在未进程分配内存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区,从中划分出一块与请求大小相等的内存空间分配给作业。进行空闲分区分配时,会采用循环查找方式,即如果最后一个(链尾)空闲分区的大小仍不能满足要求,则返回第一个空闲分区。该算法能使内存中的空闲分区分布得更加均匀,从而减少了查找空闲分区时的开销,但是会缺乏大的空闲分区。
  3. 最佳适应算法(Best Fit)
  该算法总是能把满足要求、又是最小的康县分区分配给作业,避免大材小用,为了加速寻找,该算法要求把所有的空闲分区按其容量以从小到大的顺序形成一个空闲分区链,这样,第一次就能找到满足要求的空闲区,必然是最佳的,孤立地看,最佳适应算法似乎是最佳的,然而宏观上却不一定,因为每次分配后所切割下来的剩余部分总是最小的,会留下很多难以使用的小空闲区。
  4. 快速适应算法(Quick Fit)
  该算法又称为分类搜索法,是将空闲分区容量大小进行分类,对于每一类具有相同容量的所有空闲分区,单独设立一个空闲分区链表,这些,系统中存在多个空闲分区链表,同时在内存中设立一张管理索引表,该表的每一项对应了一种空闲分区类型,并记录了该类型空闲分区链表表头的指针。该算法的优点是查找效率高,仅需根据进程的长度,寻找到能容纳它的最小空闲区链表,并取下第一块进行分配即可。该算法在进行空闲分区分配时,不会对任何分区产生分割,所以能保留大的分区,满足对大空间的需求,也不会产生内存碎片。但是在分区归还主存时算法复杂,系统开销大。
 二、基本分页存储管理方式
  连续分配方式会形成很多碎片,为之进行紧凑操作的开销非常大,如果允许一个进程直接分散地装入到许多不相邻接的分区中,则无须进行紧凑操作,基于这一思想产生了离散分配方式,如果离散分配的基本单位是页,则称为分页存储管理方式,若为段,则为分段存储管理方式。
  1 页面与页表
  分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页进行编号,从0开始。相应地,把内存空间分成与页面相同大小的若干个存储块,称为(物理)块或者页框,也同样为它们编号,如0#块,1#块等。在未进程分配内存时,以块为单位将进程的若干个页分别装入到多个可以不相邻接的物理块中,由于进程的最后一页经常装不满一块而形成不可利用的碎片,称之为页内碎片。
  在分页系统中的页面其大小应适中,页面若太大,一方面可以是内存碎片减少,有利于提供内存利用率,但是,每一个进程占用的页面较多,导致页表过长,占用太多内存,会降低页面换进换出的效率。页面若太大,可减少页表的长度,提供页面换进换出的速度,但是,内存碎片会增大,所以,也页面大小应适中,通常为512B~8K
  说明:前一部分为页号P,后一部分为位移量W(或称为页内地址),总共32位,其中0-11位为页内地址,每页大小4kb,12-31位为页号,地址空间最多允许1M页。
  为了能够保证在内存中找到每个页面所对应的物理块,系统为每个进程建立了一张页面映射表,简称为页表。页表项纪录了相应页在内存中对应的物理块号,在配置了页表后,进程执行时,通过查找该表,即可找到每页在内存中的物理块号,页表实现了从页号到物理块号的地址映像。
 2 地址变换机构
  为了能够将用户地址空间中的逻辑地址变换为内存空间中的物理地址,在系统中必须设置地址变换机构,该机构的基本任务是实现从逻辑地址到物理地址的转换,由于页内地址与物里块内的地址一一对应,无须再进行转换,因此,地址变换机构的任务实际上只是将逻辑地址中的页号转换为内存中的物理块号。又因为页面映射表的的作用就是用于实现从页号到物理块号的变换,因此,地址变换任务是借助页表来完成的。
  三、基本分段存储管理方式
  从固定分区到动态分区分配,再到分页存储管理方式,其主要动力为提高内存利用率,引入分段存储管理的目的在于满足用户在编程和使用上多方面的要求。如
  ① 方便编程,用户可以把自己的作业按照逻辑关系划分为若干段,每个段都是从0开始编址,并有自己的名字和长度。
  ② 信息共享,在实现对程序和数据的共享时,是以信息的逻辑单位为基础的,比如共享某个函数。
  ③ 信息保护,信息保护同样是对信息的逻辑单位进行保护。
  ④ 动态增长,在实际应用中,数据段在使用过程中往往会不断增长,而实现无法确切知道数据段会增长到多大,分段可以较好的解决这个问题。
  ⑤ 动态链接,再运行时,先将主程序所对应的目标程序装入内存并启动运行,当运行过程中有需要调用某段时,才将该段调入内存并进行链接。
  在这里插入图片描述在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42132577/article/details/84900444
今日推荐