存储分配程序
1.首先设计对齐要求
typedef long Align;
union header
{
struct
{
union header *ptr;
unsigned size;
}s;
Align x;
};
typedef union header Header;
在malloc中请求的长度将被舍入,以保证是头部的整数倍,
static Header base;
static Header *freep;
void *malloc(unsigned ntypes)
{
Header *p,prevp;
Header *morecore(unsigned);
unsigned nunits;
nunits=(nbytes+sizeof(Header)-1)/sizeof(Header)+1;
if((prevp=freep)==NULL)
{
base.s.ptr=freep=prevp=&base;
base.s.size=0;
}
for(p=prevp->ss.ptr;;prevp=p,p=p->s.ptr)
{
if(p->s.size>=nunits)
{
if(p->s.size==nunits)
{
prevp->s.ptr=p->s.ptr;
}
else
{
p->s.szie-=nunits;
p+=p->s.size;
p->s.size=nunits;
}
freep=prevp;
return (void *)p+1;
}
if(p==freep)
{
if((p=morecore(nunits))==NULL)
{
return NULL;
}
}
}
}
上面的式子
nunits=(nbytes+sizeof(Header)-1)/sizeof(Header)+1;
保证了单元的对齐要求。
函数morecore用于向操作系统申请内存空间,然后利用free函数将申请到的内存插入到空闲的链表中,然后再去链表中存取。
#define NALLOC 1024
static Header *morecore(unsigned nu)
{
char *cp,*sbrk(int);
Header *up;
if(nu<NALLOC)
{
nu=NALLOC;
}
cp=sbrk(nu*sizeof(Header));
if(cp==(char *)-1)
{
return NULL;
}
up=(Header *)cp;
up->s.size=nu;
free((void *)(up+1));
return freep;
}
最后来看下free函数,
free函数将块放入空闲链表中;并设置freep指针
void free(void *ap)
{
Header *bp,*p;
bp=(Header *)ap-1;
for(p=freep;!(bp>p&&bp<p->s.ptr);p=p->s.ptr)
{
if(p>=p->s.ptr&&(bp>p||bp<p->s.ptr))
{
break;
}
}
if(bp+bp->size==p->s.ptr)
{
bp->s.size+=p->s.ptr->s.size;
bp->s.ptr=p->s.ptr->s.ptr;
}
else
{
bp->s.ptr=p->s.ptr;
}
if(p+p->s.size==bp)
{
p->s.size+=bp->s.size;
p->s.ptr=bp->s.ptr;//这一步必须更新
}
else
{
p->s.ptr=bp;
}
freep=p;
}