【数据结构】算法8.2 伙伴系统-分配
来源:互联网 发布:北京网络职业学院 八维 编辑:程序博客网 时间:2024/05/16 16:01
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW_SELF -2#define M 3 //可利用空间总容量64K字的2的幂次,子表的个数为M+1 //书上为16typedef int Status;typedef int ElemType;typedef struct WORD_b{ struct WORD_b *llink; //指向前驱结点 int tag; //块标志,0:空闲,1:占用 int kval; //块大小,值为2幂次K struct WORD_b *rlink; //头部域,指向后继结点}WORD_b,head; //WORD:内存字类型,结点的第一个字也称为headtypedef struct HeadNode{ int nodesize; //该链表的空闲块大小 WORD_b *first; //该链表的表头指针}FreeList[M+1]; //表头向量类型WORD_b *start,*end;/*******************************声明部分****************************************/void InitSpace_b(FreeList avail);//初始化一个内存块WORD_b* AllocBuddy(FreeList avail,int n);//avail[0...M]为可利用空间表,n为申请分配量,若有不小于n的空闲块,//则分配相应的存储块,并返回其首地址,否则返回NULLvoid PrintLayout_b(FreeList avail);//打印内存块的空闲块/*******************************函数部分****************************************/void InitSpace_b(FreeList avail){ int k; WORD_b *r; for(k = 0;k<=M;k++){ avail[k].nodesize = (int)pow(2,k); avail[k].first = NULL; } r = (WORD_b *)malloc((int)pow(2,M) * sizeof(WORD_b)); r->llink = r->rlink = r; r->tag = 0; r->kval = M; avail[M].first = r; start = r; end = r + avail[M].nodesize-1;}WORD_b* AllocBuddy(FreeList avail,int n){ int k,i; WORD_b *pa,*pre,*suc,*pi; //查找满足分配要求的子表 for(k = 0;k<=M && (avail[k].nodesize < n || !avail[k].first); ++k); if(k > M) return NULL; //分配失败,返回NULL else{ //进行分配 pa = avail[k].first; //指向可分配子表的第一个结点 pre = pa->llink; suc = pa->rlink; //分别指向前驱和后继 if(pa == suc) avail[k].first = NULL; //分配后该子表变成空表 else{ //从子表删去*pa结点 pre->rlink = suc; suc->llink = pre; avail[k].first = suc; }//else for(i = 1; k-i >= 0 && avail[k-i].nodesize >= n; ++i){ pi = pa+(int)pow(2,k-i); pi->rlink = pi; pi->llink = pi; pi->tag = 0; pi->kval = k-i; avail[k-i].first = pi; }//for pa->tag = 1; pa->kval = k-(--i); }//else return pa;}void PrintLayout_b(FreeList avail){ int k; WORD_b *r; int mark; for(k = 0,mark = 0;k<=M;k++){ if(avail[k].first){ mark = 1; break; } } if(!mark) printf("内存已被占用完!\n"); else{ printf("空闲块起止范围 : "); for(k = 0;k<=M;k++){ r = avail[k].first; if(r){ printf("| %d <--> %d |",r-start+1,r+(int)pow(2,r->kval)-start); while(r->rlink != avail[k].first){ r = r->rlink; printf("| %d <--> %d |\n",r-start+1,r+(int)pow(2,r->kval)-start); }//while }//if }//for }//else printf("\n");}/*******************************主函数部分**************************************/int main(){ FreeList avail; WORD_b *p1,*p2; InitSpace_b(avail); printf("\n初始化了一块内存\n"); PrintLayout_b(avail); p1 = AllocBuddy(avail,1); printf("\n申请了大小为 1 的内存p1\n"); PrintLayout_b(avail); p2 = AllocBuddy(avail,2); printf("\n申请了大小为 2 的内存p2\n"); PrintLayout_b(avail); return 0;}
0 0
- 【数据结构】算法8.2 伙伴系统-分配
- 内存分配算法 伙伴系统
- 伙伴算法分配过程
- 伙伴系统算法中的伙伴
- 伙伴系统算法中的伙伴
- 伙伴系统分配器 分配掩码
- Linux内存分配--伙伴系统
- 伙伴系统算法
- 伙伴系统算法
- 4伙伴系统算法
- 【转】伙伴系统算法
- 伙伴系统算法
- 伙伴系统算法
- 伙伴系统算法详解
- 内存分配算法之伙伴算法
- 内存分配-----伙伴算法和slab算法
- 采用伙伴系统算法编写内存分配和回收模拟程序
- Linux伙伴系统(三)--分配页
- Ubuntu--(3)shell快速入门
- jquery实现图片轮番效果(一)
- Android Activity 切屏处理
- Android调用打电话(Call Phone)
- Android自定义ListFragment 显示
- 【数据结构】算法8.2 伙伴系统-分配
- POI写入Excel下拉框[Select选项]
- mvn jetty:run内存溢出解决
- Web框架学习篇--Strust1(一) 原理
- 程序员心里的侥幸
- 举例让抽象具体化-面试题22-栈的压入、弹出序列
- redis 配置‘随手记
- 记录springmvc+ueditor1.4.3上传附件问题
- spring集成ActiveMQ, 消息提供者