第三节:首次适应法的分析.ppt

  1. 1、本文档共31页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三节:首次适应法的分析

* malloc(),mfree() 2015.4.7星期二(双周) 深刻理解计算机 上机编程:分配器 首次适应算法、最佳适应算法、下一次适应算法 首次适应算法分析 #includestdlib.h void *malloc(size_t,size); malloc函数返回一个指针,指向大小为至少size字节的存储器块。 如果malloc遇到问题,那么返回NULL。 注意:与教材中的malloc函数不同。 free函数释放已经分配的malloc块 #includestdlib.h void free(void *ptr) Ptr参数必须指向一个从malloc获得的已经分配块的起始位置。 malloc和free分配和释放块 1 2 3 4 malloc(4*sizeof(int)) 1 2 3 4 5 6 7 8 9 malloc(5*sizeof(int)) 1 2 3 4 free 第二次分配的5个int 1 2 3 4 5 6 malloc(2*sizeof(int)) malloc算法分析 首次适应算法:从头开始搜索空闲链表,选择第一个合适的空闲块。 将大的空闲块保留在链表的后面。链表起始处留下小的空闲块的碎片,增加了对较大块的搜索时间。 首次适应算法速度很快,因为它尽可能少地搜索链表结点。 下一次适应算法和首次适应算法很相似,是不过不是从链表的起始处开始每次搜索,而是从上一次查询结束的地方开始。 若上一次在一个空闲块中发现足够的空间,那么这一次也能在这个剩余块中发现所需空间。 比首次适应算法快,利用率却低。 最佳适应算法检查数组的每一个空闲块,选择适合所需请求大小的最小空闲块。 内存管理:使用coremap[] coremap[]按照map的起始地址排序。 首次适应算法 存储管理器对coremap[]进行搜索,直到找到一个足够大的空闲区。 若空闲区大小和要分配的空间大小正好一样,否则将该空闲区分为两部分,一部分供进程使用,另一部分形成新的空闲区。 教材p77的例题 例题1. coremap[]: 进程申请空间大小是15 (1)搜索coremap[],找到第一个长度=15的空闲区 20 10 coremap[2] 50 30 coremap[1] 100 20 coremap[0] 0 coremap[CMAPSIZ] …… 20 10 coremap[0] m_size=3015,首次找到一个足够大的空闲区 50 30 coremap[1] m_size=1015 (2)空闲区的分配 新的coremap[]数组 50 30 coremap[1] 分配15个块出去,则: m_size=30-15=15, m_addr=50+15=65。 20 10 coremap[2] 65 15 coremap[1] 100 20 coremap[0] 0 coremap[CMAPSIZ-1] …… 教材p78的例题 例题2. coremap[]: 进程申请空间大小是30 (1)搜索coremap[],找到第一个长度=15的空闲区 20 10 coremap[2] 50 30 coremap[1] 100 20 coremap[0] 0 coremap[CMAPSIZ] …… 20 10 coremap[0] m_size=30=30,首次找到一个足够大的空闲区 50 30 coremap[1] m_size=1015 例题2 (2)空闲区的分配 若m_size==0,则应删除这个元素,coremap[]数组剩下的元素向前移动一个位置。 50 30 coremap[1] 分配30个块出去,则: m_size=30-30=0, m_addr=50+30=80 20 10 100 20 coremap[1] coremap[0] 0 coremap[CMAPSIZ-2] …… 80 0 coremap[1]有变化 malloc()函数 malloc(mp,size) Struct map *mp; { register int a; //a是malloc返回的分配区的起始块号 register struct map *bp; //bp是工作块 malloc() for(bp=mp;bp-m_size;bp++) //搜索coremap[] if(bp-m_size=size) //找到第一个空白区m_size=size,则分配。 a=bp-m_addr; //返回值为分配区域的起始块号 bp-m_addr=+size; //空白区的起始地址变化 if((bp-m_size=-size)==0) //若此

文档评论(0)

shaofang00 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档