- malloc/calloc/free是库函数,在底层使用系统调用进行内存申请,自己添加了中间层进行管理,brk,sbrk,mmap,munmap是系统调用。申请的是虚存
- mmap 映射匿名页, 当发生缺页异常时, linux 内核为缺页分配一个新物理页,并将该物理页清 0
- 对空闲的小内存块只会在 malloc 和 free 的时候进行合并
- 主分配区与非主分配区用环形链表进行管理。 每一个分配区利用互斥锁( mutex)使线程对于该分配区的访问互斥。
- 每个进程只有一个主分配区,但可能存在多个非主分配区, 主分配区可以访问进程的 heap 区域和 mmap 映射区域, 非主分配区每次使用 mmap()向操作系统“批发” HEAP_MAX_SIZE
- 当某一线程需要调用 malloc()分配内存空间时, 该线程先查看线程私有变量中是否已经存在一个分配区,如果存在, 尝试对该分配区加锁,如果加锁成功,使用该分配区分配内存,如果失败, 该线程搜索循环链表试图获得一个没有加锁的分配区。如果所有的分配区都已经加锁,那么 malloc()会开辟一个新的分配区,把该分配区加入到全局分配区循环链表并加锁,然后使用该分配区进行分配内存操作。在释放操作中,线程同样试图获得待释放内存块所在分配区的锁,如果该分配区正在被别的线程使用,则需要等待直到其他线程释放该分配区的互斥锁之后才可以进行释放操作
- Bins
- ptmalloc将相似大小的 chunk 用双向链表链接起来,这样的一个链表被称为一个 bin。 Ptmalloc 一共维护了 128 个 bin,并使用一个数组来存储这些 bin。数组中的第一个为 unsorted bin,
动态内存分配小结
最新推荐文章于 2022-05-08 17:22:32 发布
![](https://img-home.csdnimg.cn/images/20240611030827.png)