2009年3月18日 星期三

malloc的實作方式

关于第一个问题, 为什么malloc()返回地址的问题, 还是上面说的那样, malloc的实现有一个优化,
1. 当你malloc()一块很小的内存是, glibc调用brk(), 只需要在heap中移动一下指针, 即可获得可用虚存, 这样分配得到的地址较小.
2. 当你malloc()一块较大内存时, glibc调用mmap(), 需要在内核中重新分配vma结构等, 他会在靠近栈的地方分配虚存, 这样返回的地址大.
3. 这个较小和较小的临界值是一个通过mallopt()调整的.
4. 当然, 除了上面的规则, malloc()还有自己的算法, 来判断到底采用mmap()还是brk(), 一般和虚存碎片有关.

/* Allocate the new heap block. */

//两种方式,一种是sbrk() 另一种是mmap()。后面做为一个专题介绍

#ifdef MALLOC_USE_SBRK

__malloc_lock_sbrk ();

/* Use sbrk we can, as it's faster than mmap, and guarantees

contiguous allocation. */

block = sbrk (block_size);

if (likely (block != (void *)-1))

{

/* Because sbrk can return results of arbitrary

alignment, align the result to a MALLOC_ALIGNMENT boundary. */

long aligned_block = MALLOC_ROUND_UP ((long)block, MALLOC_ALIGNMENT);

if (block != (void *)aligned_block)

/* Have to adjust. We should only have to actually do this

the first time (after which we will have aligned the brk

correctly). */

{

/* Move the brk to reflect the alignment; our next allocation

should start on exactly the right alignment. */

sbrk (aligned_block - (long)block);

block = (void *)aligned_block;

}

}

__malloc_unlock_sbrk ();

#else /* !MALLOC_USE_SBRK */

/* Otherwise, use mmap. */

block = mmap (0, block_size, PROT_READ | PROT_WRITE,

MAP_SHARED | MAP_ANONYMOUS, 0, 0);

#endif /* MALLOC_USE_SBRK */

1 則留言:

pytho 提到...

more tips here replica bags in london read more replica nappy bags see post replica bags by joy