如何实现malloc函数

时间:2021-08-26 13:37:50
在标准c中malloc函数是如何实现的
不同系统中有什么不同如linux/windows/dos
能给了源代码吗?谢谢

10 个解决方案

#1


在 VC 中单步调试跟踪就清楚了。我只知道 Win32 是用的
HeapCreate 和 HeapAlloc 分配内存,HeapFree 和 HeapDestory 清理

#2


ODS中是调用int 21H 的内存分配功能号来分配的.

#3


我刚看完英文版的《the c programming language》(花了两个月,呵呵),现学现卖。
在该书的第185-189页,有详细的说明,在unix下的实现。
/*内存块的数据结构*/
typedef long Align    /*for allignment to long boundary*/
union header         /* block header */
{
  struct
  {
     union header *ptr; /* next block if on free list */    
     unsigned size;      /* size of this block  */  
  }
  Align x;              /* force alignment of blocks*/
};
typedef union header Header;

#4


static Header base;      /* empty list to get started*/
static Header *freep = NULL;  /*start of free list*/
/* malloc  :general-purpose storage allocator*/
void *malloc(unsigned nbytes)
{
  Header *p,*prevp;
  Header *morecore*(unsigned); /*另一个函数的声明,其作用是向操作系统申请内存
                               代码见下一贴*/
  unsigned nunits;             /*内存单元的个数*/
  nunits = (nbytes+sizeof(Header)-1)/sizeof(Header)+1;
  if ((prevp=freep) == NULL)     /*no free list*/
  {
    base.s.ptr = freep = prevp = &base;
    base.s.size = 0;
  }
  for(p=prevp->s.ptr; ;prevp = p, p=p-s.ptr)  /*注意循环条件为空*/
  {
    if(p->s.size >= nunits)                  /* big enough*/
    {
       if(p->s.size == nunits)               /*exactly equal*/
       {
          prevp->s.ptr = p->s.ptr;
       }
       else
       {
          p->s.size -= nunits;
          p += p->s.size;
          p->s.size = units; 
        }
        freep = prevp;
        rerturn (void*)(p+1);
    } /*end of first if*/ 
    if(p == freep)   /*wrapped around free list*/ 
    {
       if((p==morecoe(units)) == NULL)
       return NULL;  /*none left*/
     }
  }/*end of for*/
}/*end of malloc*/

#5


morecore的代码:
#define NALLOC /*minimun units to request*/
/*morecore ask system for more memory*/
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)       /*no space at all*/
  {
    return NULL:
  }
  up = (Header*) cp;
  up->s.size = nu;
  free(void *)(up+1));
  return freep;
}
sbrk(int n)是系统调用,功能是"return a pointer to n more bytes of storage"

#6


学习之。

#7


pf pf,学习

#8


UNIX 系统调用 sbrk (n) 返回的指针指向的空间包含 n 个额外的字节。如果没有空间,那么 sbrk 返回 -1。 ... -1 必须强制转换成 char 类型,以便与返回值相比较。
——摘自 The C Programming Language 中文版,P160,呵呵

也就是说,UNIX 的分配内存函数是 sbrk(n)。
个人以为 Win32 的 HeapCreate/HeapAlloc 双重缓冲更方便,呵呵。不要 malloc 维护一个内存池了。

#9


to 完美废人
你那有sbrk的源代码吗?麻烦贴出来好吗,大家一起学习。谢谢!

#10


interrupt(0x21);
就行了吧~~~

#1


在 VC 中单步调试跟踪就清楚了。我只知道 Win32 是用的
HeapCreate 和 HeapAlloc 分配内存,HeapFree 和 HeapDestory 清理

#2


ODS中是调用int 21H 的内存分配功能号来分配的.

#3


我刚看完英文版的《the c programming language》(花了两个月,呵呵),现学现卖。
在该书的第185-189页,有详细的说明,在unix下的实现。
/*内存块的数据结构*/
typedef long Align    /*for allignment to long boundary*/
union header         /* block header */
{
  struct
  {
     union header *ptr; /* next block if on free list */    
     unsigned size;      /* size of this block  */  
  }
  Align x;              /* force alignment of blocks*/
};
typedef union header Header;

#4


static Header base;      /* empty list to get started*/
static Header *freep = NULL;  /*start of free list*/
/* malloc  :general-purpose storage allocator*/
void *malloc(unsigned nbytes)
{
  Header *p,*prevp;
  Header *morecore*(unsigned); /*另一个函数的声明,其作用是向操作系统申请内存
                               代码见下一贴*/
  unsigned nunits;             /*内存单元的个数*/
  nunits = (nbytes+sizeof(Header)-1)/sizeof(Header)+1;
  if ((prevp=freep) == NULL)     /*no free list*/
  {
    base.s.ptr = freep = prevp = &base;
    base.s.size = 0;
  }
  for(p=prevp->s.ptr; ;prevp = p, p=p-s.ptr)  /*注意循环条件为空*/
  {
    if(p->s.size >= nunits)                  /* big enough*/
    {
       if(p->s.size == nunits)               /*exactly equal*/
       {
          prevp->s.ptr = p->s.ptr;
       }
       else
       {
          p->s.size -= nunits;
          p += p->s.size;
          p->s.size = units; 
        }
        freep = prevp;
        rerturn (void*)(p+1);
    } /*end of first if*/ 
    if(p == freep)   /*wrapped around free list*/ 
    {
       if((p==morecoe(units)) == NULL)
       return NULL;  /*none left*/
     }
  }/*end of for*/
}/*end of malloc*/

#5


morecore的代码:
#define NALLOC /*minimun units to request*/
/*morecore ask system for more memory*/
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)       /*no space at all*/
  {
    return NULL:
  }
  up = (Header*) cp;
  up->s.size = nu;
  free(void *)(up+1));
  return freep;
}
sbrk(int n)是系统调用,功能是"return a pointer to n more bytes of storage"

#6


学习之。

#7


pf pf,学习

#8


UNIX 系统调用 sbrk (n) 返回的指针指向的空间包含 n 个额外的字节。如果没有空间,那么 sbrk 返回 -1。 ... -1 必须强制转换成 char 类型,以便与返回值相比较。
——摘自 The C Programming Language 中文版,P160,呵呵

也就是说,UNIX 的分配内存函数是 sbrk(n)。
个人以为 Win32 的 HeapCreate/HeapAlloc 双重缓冲更方便,呵呵。不要 malloc 维护一个内存池了。

#9


to 完美废人
你那有sbrk的源代码吗?麻烦贴出来好吗,大家一起学习。谢谢!

#10


interrupt(0x21);
就行了吧~~~