glibc对malloc的实现

12 篇文章 0 订阅
6 篇文章 0 订阅

glibc对malloc的实现

    目前最新版本为2.18,glibc源码目录/glibc-2.18/malloc中可以看到。在glibc的malloc的实现中, 分配虚存有两种系统调用可用: brk()和mmap(), 如果要分配大块内存, glibc会使用mmap()去分配内存,这种内存靠近栈。

基于UNIX 的系统有两个可映射到附加内存中的基本系统调用:
    brk: brk() 是一个非常简单的系统调用。还记得系统中断点吗?该位置是进程映射的内存边界。 brk()只是简单地将这个位置向前或者向后移动,就可以向进程添加内存或者从进程取走内存。sbrk()是以增量的方式增加扩大内存。

   mmap: mmap(),或者说是“内存映像”,类似于 brk(),但是更为灵活。首先,它可以映射任何位置的内存,而不单单只局限于进程。其次,它不仅可以将虚拟地址映射到物理的 RAM 或者 swap,它还可以将它们映射到文件和文件位置,这样,读写内存将对文件中的数据进行读写。不过在这里,我们只关心 mmap向进程添加被映射的内存的能力。 

在glibc的malloc的实现有一个优化:
1. 当malloc()一块很小的内存是, glibc调用brk(), 只需要在heap中移动一下指针, 即可获得可用虚存, 这样分配得到的地址较小.
2. 当malloc()一块较大内存时, glibc调用mmap(), 需要在内核中重新分配vma结构等, 他会在靠近栈的地方分配虚存, 这样返回的地址大.


以上是转载的,由于实验时发生了下面的问题。。现在正好做个例子。

---------------------------------------------------------------------------------------------------------------------------



Figure1.每次分配1M,3M,6M.分配后,释放了再进行下一次分配。见block的值,是malloc的返回值即:分配内存的起始地址,依次递减。所以看出是从高地址分配的。



Figure2.每次分配1Byte,3Byte,6Byte....可见起始地址是一样的。且比较小。

----------------------------------------------------------------------------------------------------------------------------------------------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值