第八章动态存储管理_第1页
第八章动态存储管理_第2页
第八章动态存储管理_第3页
第八章动态存储管理_第4页
第八章动态存储管理_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第八章动态存储管理p存储原理n计算机内存在刚开始工作时,空闲部分是一个整块的计算机内存在刚开始工作时,空闲部分是一个整块的连续区域;连续区域;n随着用户进入系统,多次申请和释放内存以后,空闲随着用户进入系统,多次申请和释放内存以后,空闲部分不再是连续的了,而成了多个空闲区。常用链表部分不再是连续的了,而成了多个空闲区。常用链表管理,即可利用空间表管理,即可利用空间表n动态存储管理动态存储管理p指系统随机地根据用户程序申请空间的大小,进行分配空间和回收不用空间所进行的内存管理。 内存的初始状态U1U2U3U4 系统运行初期U2U4 系统运行若干时后p可利用空间表n将所有内存空闲块用链表连接而成;

2、将所有内存空闲块用链表连接而成;n空闲块的大小可以是全相同的,也可以是分成若干固空闲块的大小可以是全相同的,也可以是分成若干固定大小的,还可以是随机大小的。定大小的,还可以是随机大小的。tag size linkspacetag=0:空闲tag=1:使用av 0 2000 3000 150.p首次拟合法n分配找到的第一个不小于分配找到的第一个不小于n的空闲块的一部分。的空闲块的一部分。n操作方便,查找快捷;操作方便,查找快捷;p最佳拟合法n分配不小于分配不小于n且最接近且最接近n的空闲块的一部分。的空闲块的一部分。n尽可能将大的空闲块留给大程序使用;尽可能将大的空闲块留给大程序使用;p最坏拟合

3、法n分配不小于分配不小于n且是最大的空闲块的一部分。且是最大的空闲块的一部分。n尽可能减少分配后无用碎片;尽可能减少分配后无用碎片;p分配n根据申请内存大小利用相应的分配策略分配给用户所根据申请内存大小利用相应的分配策略分配给用户所需的空间;需的空间;n若分配块大小与申请大小相差不多,则将此块全部分若分配块大小与申请大小相差不多,则将此块全部分给用户;给用户;n否则,就需将分配块分为两部分,一部分给用户使用,否则,就需将分配块分为两部分,一部分给用户使用,另一部分继续留在可利用空间表中。另一部分继续留在可利用空间表中。p回收n测试回收块前后相邻内存块是否空闲;测试回收块前后相邻内存块是否空闲;

4、n若是则需将回收块与相邻空闲块合并成较大的空闲块,若是则需将回收块与相邻空闲块合并成较大的空闲块,再链入可利用空间表中。再链入可利用空间表中。p用以进行动态分区分配的一种管理方法p可利用空间表的结点结构llink tag size rlinkuplink tagheadfootstruct BLK struct BLK *llink;#define ulink llink /ulink直接利用llink域 int tag;int size; /* 不包括头和脚占用的空间,必须是sizeof(struct BLK)的倍数 */struct BLK *rlink;#define FootLoc(p

5、) (struct BLK *)(char *)p + sizeof(struct BLK) + p-size) p将所有的空闲块链接在一个双重循环链表结构的可利用空间表中;p分配可按首次拟合法或最佳拟合法进行;p为避免过多碎片,设一常量EPSILONnm-n EPSILON将大小为将大小为m的块全部分出的块全部分出n EPSILON分出分出n大小,剩余留下大小,剩余留下void *mem_alloc(int nbytes) #define u sizeof(struct BLK); 修正nbytes = (nbytes + u -1) / u * u; /*u为2n有:nbytes = (n

6、bytes+u-1)&(u-1) */ 从链表中找满足size=nbytes的块p; if (p=NULL) return NULL; if (p-size nbytes tag = FootLoc(p)-tag = 1; return p+1; else p-size -= nbytes + 2 * sizeof(struct BLK); f = FootLoc(p); f-tag = 0; f-uplink = p; p = f + 1; p-tag = 1; p-size = nbytes; f = FootLoc(p); f-tag = 1; f-uplink = p; return

7、p+1; p根据回收缓冲区地址,找到当前内存块的管理信息 p = (struct BLK *)buf 1;p与此内存块紧邻的,处于高地址端的内存块的管理信息 h = (struct BLK *)(char *)(p+2) + p-size);p与此内存块紧邻的,处于低地址端的内存块的管理信息 l = (p-1)-uplink;p判l-tag和h-tag,知低端/高端内存块是否空闲,决定是否和低端/高端空闲块合并void mem_free(void *buf) p = (struct BLK *)buf 1; p-tag = FootLoc(p)-tag = 0; h = (struct BLK

8、 *)(char *)(p+2) + p-size); if (h-tag = 0) h脱离空闲块链表; FootLoc(h)-uplink = p; p-size += h-size + 2 * sizeof(struct BLK); l = (p-1)-uplink; if (l-tag) 将p加入到空闲块链表; else l-size += p-size + 2 * sizeof(struct BLK); FootLoc(p)-uplink = l; (上述算法未考虑p为可分配空间第一块和最后一块的特殊情况)p查找适合需要的块,需要较多的时间p查找适合需要的块的策略(最先/最佳/最坏),

9、每种都有缺陷p碎片问题p伙伴系统的空闲块大小以2k (k=n, n+1,n+2,m)标定。按k值不同组织成多个空闲块链表av。设n=5,最小分配32字节,用一张位图维护内存中每个32字节块的使用情况(1:已分配,0:空闲)p系统开始时只有一个空闲块,大小为2m p分配(访问链表avk)n将满足用户需求的将满足用户需求的2 2k k大小的空闲块分配给用户大小的空闲块分配给用户navkavk链表空,就找链表空,就找2 2k+1k+1的空闲块,将其分为两半的空闲块,将其分为两半( (互称伙互称伙伴伴) ),一半给用户,另一半加入,一半给用户,另一半加入avkavk链表中链表中p回收:n只有伙伴才合并

10、,并将合并后的新空闲块加入上一级大只有伙伴才合并,并将合并后的新空闲块加入上一级大小的空闲块链表中。小的空闲块链表中。例:大小128字节,首地址为0 xE580的内存块,其伙伴为0 xE500例:大小128字节,首地址为0 xF600的内存块,其伙伴为0 xF680Buddy(k,Z)=Z+2k 当 Z mod 2k+1 = 0Z - 2k 当 Z mod 2k+1 = 2kp首地址为Z,大小为2k的内存块,其伙伴为p分配算法当用户申请大小为当用户申请大小为n n的内存请求的内存请求, ,在可利用空间表上寻找在可利用空间表上寻找结点大小与结点大小与n n相匹配的表相匹配的表p表非空,分配表中第

11、一个内存块p表空,从更大的非空表中查找,直到找到一个空闲块,切割出所需要大小的块p未分配部分,插入到相应的空闲表中p回收算法判断伙伴是否为空闲块判断伙伴是否为空闲块( (回收算法需了解释放的块大小回收算法需了解释放的块大小) )p否,将释放的空闲块插入到相应表中;p是,找到伙伴,伙伴出队,合并p合并后,判断合并后的块的伙伴是否是空闲块,如果是,继续合并成更大的块。依次重复,直到归并后的块的伙伴不空闲。再插入到相应的空闲块表中。分配256,128,64之后,分别是B,C,D申请128(块F),释放128(块C)释放64(块D)struct BLK int kval; struct BLK *pr

12、ev, *next;struct BLK *avM; / 多个空闲链表应当使用双向循环链表结构n可以立即找到空闲块可以立即找到空闲块n避免了碎片问题避免了碎片问题n申请内存总是以申请内存总是以2n字节满足要求,块内浪费字节满足要求,块内浪费 例如:申请例如:申请130130字节,会分得字节,会分得256256字节字节; ;申请申请15141514字节,会分得字节,会分得20482048字节字节n申请申请/释放可能会导致连锁切块释放可能会导致连锁切块/合并,影响系统效率合并,影响系统效率 例如:当前只有一块空闲,块大小例如:当前只有一块空闲,块大小1 1M, M, 申请申请4040字节,会导致字

13、节,会导致1212次次切块,用完立即归还,导致切块,用完立即归还,导致1212次合并。如果程序循环式申请次合并。如果程序循环式申请4040字字节,然后归还内存,会导致系统频繁忙碌。节,然后归还内存,会导致系统频繁忙碌。nLazy-Buddy 解决申请解决申请/ /释放可能会导致连锁切块释放可能会导致连锁切块/ /合并。该合并时,通过一定合并。该合并时,通过一定“lazylazy”策略策略, ,暂时不合并,在合适的时机合并暂时不合并,在合适的时机合并nSlab 最早出现最早出现在在Solaris, 在在Linux中采用中采用 避免了碎片问题,并且与内存的分页系统很好配合工作,分配归避免了碎片问题,并且与内存的分页系统很好配合工作,分配归还的效率很高。还的效率很高。 基本思路:每次申请一个内存页面(基本思路:每次申请一个内存页面(4096字节)或者多个,切割字节)或者多个,切割成所需要的固定大小。不同大小的内存申请,使用不同的空闲队成所需要的固定大小。不同大小的内存申请,使用不同的空闲队列。列。p边界标识法需要哪些管理信息?给出相

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论