malloc 底层实现

本文详细介绍了malloc在Linux下的实现,包括brk(sbrk)和mmap系统调用,以及ptmalloc的内存分配策略。ptmalloc通过主分区和非主分区管理内存,使用chunk组织内存块,并通过bins和fastbins进行内存分配与回收。malloc分配内存时,会优先考虑fast bins,然后是unsorted bin,最后是bins和top chunk。释放内存时,会进行合并操作,并可能触发fast bins的合并和堆收缩。
摘要由CSDN通过智能技术生成

malloc 申请内存的系统调用

首先看一下linux 下的4G的虚拟地址空间的分布
在这里插入图片描述
linux系统向用户提供申请的内存有brk(sbrk)和mmap函数。下面我们先来了解一下这几个函数

brk(sbrk)

#include <unistd.h>
	int brk(void *addr);
 	void *sbrk(intptr_t increment);

mmap

#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
int munmap(void *addr, size_t length)

ptmalloc 简介

ptmalloc 实现了 malloc(),free()以及一组其它的函数. 以提供动态内存管理的支持。分配器处在用户程序和内核之间,它响应用户的分配请求,向操作系统申请内存,然后将其返回给用户程序,为了保持高效的分配,分配器一般都会预先分配一块大于用户请求的内存,并通过某种算法管理这块内存。来满足用户的内存分配要求,用户释放掉的内存也并不是立即就返回给操作系统,相反,分配器会管理这些被释放掉的空闲空间,以应对用户以后的内存分配要求。也就是说,分配器不但要管理已分配的内存块,还需要管理空闲的内存块,当响应用户分配要求时,分配器会首先在空闲空间中寻找一块合适的内存给用户,在空闲空间中找不到的情况下才分配一块新的内存。为实现一个高效的分配器,需要考虑很多的因素。比如,分配器本身管理内存块所占用的内存空间必须很小,分配算法必须要足够的快。

主分区与非主分区

在 Doug Lea实现的内存分配器中只有一个主分配区(main arena),每次分配内存都必须对主分配区加锁,分配完成后释放锁,在 SMP 多线程环境下,对主分配区的锁的争用很激烈,严重影响了 malloc 的分配效率。

每个进程只有一个主分配区,但可能存在多个非主分配区,ptmalloc 根据系统对分配的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值