第八章 动态存储管理
8.11
typedef struct {
char *start;
int size;
} fmblock; //空闲块类型
char *Malloc_Fdlf(int n)//遵循最终安排者最先释放规则的内存安排算法
while(Gettop(S,b)&&b.size<n)
Pop(S,b);
Push(T,b); //从栈顶逐个取出空闲块进行比较
if(StackEmpty(S)) return NULL; //没有大小足够的空闲块
Pop(S,b);
b.size-=n;
if(b.size) Push(S,{b.start+n,b.size});//分割空闲块
while(!StackEmpty(T))
Pop(T,a);
Push(S,a);
} //复原原来次序
return b.start;
}//Malloc_Fdlf
mem_init()//初始化过程
InitStack(S);InitStack(T); //S 和 T 的元素都是 fmblock 类型
Push(S,{MemStart,MemLen}); //一开始,栈中只有一个内存整块
}//main
8.12
void Free_Fdlf(char *addr,int n)//及上一题对应的释放算法
while(Gettop(S,b)&&b.start<addr)
Pop(S,b);
Push(T,b);
} //在按地址排序的栈中找到合适的插入位置
if(Gettop(T,b)&&(b.start+b.size==addr)) //可以及上邻块合并
Pop(T,b);
addr=b.start;n+=b.size;
if(Gettop(S,b)&&(addr+n==b.start)) //可以及下邻块合并
Pop(S,b);
n+=b.size;
Push(S,{addr,n}); //插入到空闲块栈中
while(!StackEmpty(T))
Pop(T,b);
Push(S,b);
} //复原原来次序
}//Free_Fdlf
8.13
void Free_BT(Space &pav,Space p)//在边界标识法的动态存储管理系统中回收空闲块 p
n=p->size;
f=p+n-1; //f 指向空闲块底部
if((p-1)->tag&&(f+1)->tag) //回收块上下邻块均为占用块
p->tag=0;f->tag=0;
f->uplink=p;
if(!pav)
p->llink=p;
p->rlink=p;
else
q=pav->llink;
p->llink=q;p->rlink=pav;
q->rlink=p;pav->llink=p;
pav=p;
}//if
评论0
最新资源