当前位置: 首页 > Linux kernrl, 内存管理 > 正文

[原]内存管理器(八)基于Glibc malloc 实现内存管理程序

前言

说明

图解

这里写图片描述

这里大概说明一下,一个主分配区,其中包含一个头结构负责记录一些全局的信息,后边就是bins,free 的分配块会首先放在这里,暂时不给操作系统,以留后用,再后边是我们分配的主题空间。

代码

头文件和宏

这里我们按照8字节对齐,所以每一个大小的最后三个位始终为0,我们就可以利用这三个位来做一些标记,我们设置最后一位为是否使用的标记位,倒数第二位为是否从heap分配的空间,如果是就置为1,不是就为0。

数据结构

初始化模块

初始化内存池的链表结构(bins结构)

分配系列函数

回收

这里的回收函数我处理的比较简单,首先看看它的大小如果大于65这里自然就是mmap()函数分配的,调用munmap()函数进行释放,否则加进我们的bins 以留后用,但是这里应该由一个heap的紧缩操作判断,我没有写,有兴趣的朋友可以尝试下,我说下原理,很简单的。

这里大家应该能看到,释放的内存现在并没有还给操作系统,而是再我们的bins 中,紧缩操作就是找到堆的底部,向上查看,如果底层上边的块是空闲的并且他们的大小之和到达某一个阀值就使用munmap()函数来释放这片内存,不然会发生“内存暴增“的问题。

作者:zmrlinux 发表于2015/10/26 17:02:16 原文链接
阅读:9 评论:0 查看评论
]]>

本文固定链接: http://zmrlinux.com/2015/10/27/%e5%8e%9f%e5%86%85%e5%ad%98%e7%ae%a1%e7%90%86%e5%99%a8%ef%bc%88%e5%85%ab%ef%bc%89%e5%9f%ba%e4%ba%8eglibc-malloc-%e5%ae%9e%e7%8e%b0%e5%86%85%e5%ad%98%e7%ae%a1%e7%90%86%e7%a8%8b%e5%ba%8f/ | Kernel & Me

该日志由 root 于2015年10月27日发表在 Linux kernrl, 内存管理 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: [原]内存管理器(八)基于Glibc malloc 实现内存管理程序 | Kernel & Me