动态储存管理ppt课件_第1页
动态储存管理ppt课件_第2页
动态储存管理ppt课件_第3页
动态储存管理ppt课件_第4页
动态储存管理ppt课件_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

1、1本章内容本章内容8.1动态存储管理概述动态存储管理概述8.2 可利用空间表及分配方法可利用空间表及分配方法8.3 边界标识法边界标识法8.4 伙伴系统伙伴系统2+存储管理每一种数据结构都必须研究该结构的存储结构,但它是借助于某一高级语言中的变量说明来加以描述的,并没有涉及到具体的存储分配。实际上,结构中的每个数据元素都占有一定的内存位置,在程序执行的过程中,数据元素的存取是通过对应的存储单元来进行的。研究数据存储与内存单元对应问题,就是存储管理问题。3+动态存储管理的基本问题1. 如何根据用户提出的“请求”来分配内存。2. 如何收回被用户“释放”的内存,以备新的“请求”产生时重新进行分配。4

2、+存储原理计算机内存在刚工作时,空闲部分是一个整块的连续区域;不断运行程序,多次申请和释放内存以后,空闲内存不再连续,形成多个不连续的空闲区。动态存储管理:指系统随机地根据用户程序申请空间的大小,进行分配空间和回收不用空间所进行的内存管理。占用块:将系统已分配给用户使用的地址连续的内存区域为“占用块”;空闲块:称未曾分配的地址连续的内存区为“空闲块”。 内存的初始状态内存的初始状态U2U4 系统运行若干时后系统运行若干时后U1U2U3U4 系统运行初期系统运行初期5+可利用空间表内存空间的所有可利用的空闲空间的情况记录表。有两种结构:1. 目录表;2. 链表:一个结点表示一个空闲块。av100

3、003100059000链表链表目录表目录表内存状态内存状态01000025000310003900059000999996本节主要讨论利用可利用空间表进行动态存储分配的方法。目录表法比较简单,在操作系统课程中已详细介绍。本节仅讨论链表方法分配内存。7+三种结构形式: 第一种情况:系统运行期间所有用户请求分配的存储量大小相同;具体作法是:开始运行时将内存区分割成若干大小相同的块,形成一可利用链表,分配和回收操作如同一般链表。 第二种情况:系统运行期间用户请求分配的存储量有若干种大小的规格;具体作法是:先建立若干个可利用空间表,同一链表中的结点小相同,分配/回收情况:结点大小与请求分配量相同时;

4、 结点大小比请求量大时; 结点大小比请求量小时。8type = 0 节点大小为节点大小为2字节字节1 节点大小为节点大小为4字节字节2 节点大小为节点大小为8字节字节tag = 0 空闲块空闲块1 占用块占用块av2av4av8可利用空间表可利用空间表9 第三种情况:系统在运行期间分配给用户的内存块的大小不固定,可以随请求而变。+工作情况:系统刚开始工作时,整个内存空间是一个空闲块,随时着分配和回收的进行,可利用空间表中的结点大小和个数也随之而变。10+分配方法 若某用户需大小为n的内存,而可利用空间仅有一块大小为 mn 的空闲块,则只需将其中大小为n 的一部分分配给申请的用户,同时将乘余的

5、m-n 的部分作为一个结点留在链表中即可。 若可利用空间表有若干个不小于n的空闲块时,可有三种不同的分配方案:111.首次拟合法 分配找到的第一个不小于n的空闲块的一部分。 操作方便,查找快捷;2.最佳拟合法 分配不小于n且最接近n的空闲块的一部分。 尽可能将大的空闲块留给大程序使用;3.最坏拟合法 分配不小于n且是最大的空闲块的一部分。 尽可能减少分配后无用碎片;12+内存的分配与回收 分配根据申请内存大小利用相应分配策略分配给用户所需空间;若分配块大小与申请大小相差不多,则将此块全部分给用户;否则,将分配块分为两部分,一部分给用户使用,另一部分继续留在可利用空间表中。 回收测试回收块前后相

6、邻内存块是否空闲;若是则需将回收块与相邻空闲块合并成较大的空闲块,再链入可利用空间表中。13+用以进行动态分区分配的一种管理方法+节点结构可利用空间表中的节点结构图可利用空间表中的节点结构图p 可利用空间表中的节点结构定义可利用空间表中的节点结构定义type struct WORD /WORD,内存数据类型内存数据类型 union /head 和和 foot 分别是节点的第一个和最后一个字分别是节点的第一个和最后一个字 WORD *llink; /头部域,指向前趋节点头部域,指向前趋节点 WORD *rlink; /底部域,指向本节点头部底部域,指向本节点头部 ; int tag; /块标志块

7、标志: 0空闲空闲,1占用占用.头部和尾部均头部和尾部均有有 int size; /头部域,块大小头部域,块大小 WORD *rlink; /头部域,指向后继节点头部域,指向后继节点 otherType other; /字的其他部分字的其他部分 WORD, head, foot, *Space; /*Space: 可利用空间指针类型可利用空间指针类型#define FootLoc(p) p+p-size-1 /指向指向p所指节点的底部所指节点的底部+分配算法:采取首次拟合法进行分配。有两个约定:1. 假设待分配的内存空闲块容量为m 个字,若每次分配只从中分配n个字(nm)给用户,剩余m-n个字

8、的节点仍留在表中,若干次分配后,链表中存在大量容量极小,总分配不出去的空闲块。解决的办法是:确定一个常量e,当m-nsizerlink!=pav; p=p-rlink;) /如果查找不小于如果查找不小于n的空闲块,找不到返回的空闲块,找不到返回NULL if (!p | p-sizerlink; /pav指向指向*p节点的后继节点的后继 if (p-size-n=e) /整块分配,不保留整块分配,不保留llink=p-llink;p-llink-rlink =pav; p-tg=f-tag=1; /修改分配节点的头部和底部标志修改分配节点的头部和底部标志 else /分配该块后的分配该块后的n

9、个字个字 f-tag=1; /修改分配块的底部标志修改分配块的底部标志 p-size - =n; /修改剩余块大小修改剩余块大小 f=FootLoc(p); /指向剩余块底部指向剩余块底部 f-tag=0; f-uplink=p; /设置剩余块底部设置剩余块底部 p=f+1; /指向分配块头部指向分配块头部 p-tag=1; p-size=n; /设置分配块头部设置分配块头部 return p; /返回分配块的首地址返回分配块的首地址 16+回收算法用户释放占用块后,系统需立即回收以备新的请求产生时进行再分配。为了使物理地址毗邻的空闲块结合成一个尽可能大的结点,则首先需要检查刚释放的占用块的左

10、、右紧邻是否为空闲块。假设用户释放的内存区的头部地址为p,则p-1=与其低地址紧邻的内存区的底部地址,即左邻区;p+psize=与其高地址紧邻的内存区的头部地址,即右邻区。17a)释放块的左、右邻区均为占用块此时只要作简单插入即可。由于边界标识法在按首次拟合进行分配时对可利用空间表的结构没有任何要求,则新的空闲块插入在表中任何位置均可。简单的做法就是插入在pav指针所指结点之前(之后),描述如下:ptag = 1= 0;FootLoc (p)uplink = p;FootLoc (p)tag = 0;if (!pav)pav = pllink = prlink = p;else q = pav

11、llink;prlink = pav;pllink = q;qrlink = pavllink = p;pav = p; /令刚释放的结点为下次分配时的最先查询的结点令刚释放的结点为下次分配时的最先查询的结点18b)释放块的左邻区为空闲块,而右邻区为占用块由于释放块的头部和左邻空闲块的底部毗邻,因此只要改变左邻空闲块的结点:增加结点的size域的值且重新设置结点的底部即可。描述如下n = psize; /释放块的大小释放块的大小s = (p1)uplink; /左邻空闲块的头部地址左邻空闲块的头部地址ssize + = n; /设置新的空闲块大小设置新的空闲块大小f = p + n1; /设置

12、新的空闲块底部设置新的空闲块底部fuplink = s;ftag = 0;19c)释放块的右邻区为空闲块,而左邻区为占用块由于释放块的底部和右邻区空闲块的头部毗邻,因此,当表中结点由原来的右邻空闲块变成合并后的大空闲块时,结点的底部位置不变,但头部要变,由此,链表中的指针也要变。描述如下:t = p + psize;/右邻空闲块的头部地址右邻空闲块的头部地址ptag = 0;/p为合并后的结点头部地址为合并后的结点头部地址q = tllink; /q为为*t结点在可利用空间表中的前驱结点的头部地址结点在可利用空间表中的前驱结点的头部地址pllink = q;/q指向指向*p的前驱的前驱qrli

13、nk = p;q1 = trlink; /q1为为*t结点在可利用空间表中的后继结点的头部地址结点在可利用空间表中的后继结点的头部地址prlink = q1;/q1指向指向*p的后继的后继q1llink = p;psize + = tsize;/新的空闲块的大小新的空闲块的大小FootLoc (t)uplink = p;/底部指针指向新结点的头部底部指针指向新结点的头部20d)释放块的左、右邻区均为空闲块为使3个空闲块连接在一起成为一个大结点留在可利用空间表中,只要增加左邻空闲块的space容量,同时在链表中删去右邻空闲块结点即可。所作改变可描述如下:n = psize; /释放块的大小释放块

14、的大小s = (p1)uplink; /指向左邻块指向左邻块t = p + psize; /指向右邻块指向右邻块ssize + = n + trlink; /设置新结点的大小设置新结点的大小q = tllink; /q != q1q1 = trlink;qrlink = q1; /删去右邻空闲块结点删去右邻空闲块结点q1llink = q;FootLoc (t)uplink = s; /新结点底部指针指向其头部新结点底部指针指向其头部21例如,在上述情况下可利用空间表的变化如图例如,在上述情况下可利用空间表的变化如图8.6所示。所示。30 0001 20 000120 00000 30 000

15、左邻区左邻区释放块释放块(a) 释放的存储块释放的存储块(b) 左邻区是空闲块的情况左邻区是空闲块的情况(c) 右邻区是空闲块的情况右邻区是空闲块的情况00 35 0000 15 000右邻区右邻区释放块释放块右邻区右邻区释放块释放块22(d) 左、右邻区均是空闲块的情况左、右邻区均是空闲块的情况回收存储块后的可利用空间表回收存储块后的可利用空间表00 15 0000 45 000右邻区右邻区释放块释放块右邻区右邻区左邻区左邻区23+边界表示法的问题 查找适合需要的块,需要较多的时间 查找适合需要的块的策略(最先/最佳/最坏),每种都有缺陷 碎片问题24+伙伴系统(buddy system):

16、是操作系统中用到的一种动态存储管理方法。它和边界标识法类似,在用户提出申请时,分配一块大小“恰当”的内存区给用户;反之,在用户释放内存区时即收回。+伙伴系统的特点:无论是占用块或空闲块,其大小均为2的k次幂(k为某个正整数)。25+结点结构表头结点表头结点headllink tag kval rlinkspacenodesize firstn 结点:右头部结点:右头部head和和space域组成。域组成。 head:为结点头部,是一个由:为结点头部,是一个由4个域组成的记录。个域组成的记录。 llink: 链域,指向同一链表中的前驱结点。链域,指向同一链表中的前驱结点。 rlink: 链域,指

17、向同一链表中的后继结点。链域,指向同一链表中的后继结点。 tag: 标志域,值为标志域,值为“0”表示空闲块,值为表示空闲块,值为“1”表示占用块。表示占用块。 kval: 其值为其值为2的幂次的幂次k。 space:数据域,是一个大小为:数据域,是一个大小为2k1个字的连续内存空间。个字的连续内存空间。n 表头结点:由两个域组成。表头结点:由两个域组成。 nodesize:表示该链表中空闲块的大小。:表示该链表中空闲块的大小。 first:该链表的表头指针。:该链表的表头指针。26+可利用空间表的结构C语言描述#define m 16 /可利用空间总容量可利用空间总容量64k字的字的2的幂次

18、,子表的个数为的幂次,子表的个数为m+1typedef struct WORD_b WORD_b *llink; /头部域,指向前驱结点头部域,指向前驱结点 int tag; /块标志,块标志,0:空闲,:空闲,1:占用。:占用。 int skval; /块大小,值为块大小,值为2的幂次的幂次k WORD_b *rlink; /头部域,指向后继结点头部域,指向后继结点 OtherType other; /字的其他部分字的其他部分 WORD_b, head; /WORD:内存字类型,结点的第一个字也称:内存字类型,结点的第一个字也称headtypedef struct HeadNode int

19、nodesize; /该链表的空闲块的大小该链表的空闲块的大小 WORD_b *first; /该链表的表头指针该链表的表头指针 FreeListm + 1; /表头向量类型表头向量类型27+示例:可利用空间表的初始状态如下图所示,其中m个子表都为空表,只有大小为2m的链表中有一个结点,即整个存储空间。(a) 表的初始状态表的初始状态nodesize first20212k2m0 m伙伴系统中的可利用空间表伙伴系统中的可利用空间表28+分配算法当用户提出大小为n的内存请求时,首先在可利用表上寻找结点大小与n相匹配的子表,若此子表非空,则将子表中任意一个结点分配之即可;若此子表为空,则需从结点更

20、大的非空子表中去查找,直至找到一个空闲块,则将其中一部分分配给用户,而将剩余部分插入相应的子表中29+算法实现WORD_b AllocBuddy (FreList &avail, int n) /avail0.m为可利用空间表,为可利用空间表,n为申请分配量,若有不小于为申请分配量,若有不小于n的空的空 /闲闲/块,则分配相应的存储块,并返回其首地址;否则返回块,则分配相应的存储块,并返回其首地址;否则返回NULL for (k = 0; k = m & (availk.nodesize m) /分配失败返回分配失败返回NULL return NULL; else /进行分配进

21、行分配 pa = availk.first; /指向可分配子表的第一个结点指向可分配子表的第一个结点 pre = pallink; /分别指向前驱和后继分别指向前驱和后继 suc = parlink; if (pa = = suc) /分配后该子表变成空表分配后该子表变成空表 availk.first = NULL; else /从子表中删去从子表中删去*pa结点结点 prerlink = suc; sucllink = pre; availk.first = suc; for (i=1; availk-i.nodesize=n+1; +i) pi = pa + 2k-i; pirlink = pi; pillink = pi; pitag = 0; pikval = ki; availk-i.first = pi; /将剩余块插入相应子表将剩余块插入相应子表 patag = 1; pakval = k(i); / else return pa; / AllocBuddy30+例子: 假设分配前的可利用空间表的状态如下图所示。若2k-1n2k-1,又第k1个子表不空,

温馨提示

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

评论

0/150

提交评论