在Open×××中,一种很不错的内存管理方案是基于链表的,该方案的实现使用了一个gc_arena结构体,该结构体的作用就是将所有的动态分配的内存块收集汇集起来,然后就可以在一个地方统一释放,c语言对动态内存管理的劣势就是无法跟踪动态内存,因此也就将管理动态内存的事情交给了程序员来完成,然后就有了无数次的由于内存泄露导致的bug,虽然c++实现了很多内存管理方案,比如智能指针之类的,但是其复杂性无不揉进了c++这种重量级语言本身,使得本已复杂的语言带上特定的库之后更加臃肿,并且在c++中实现的动态内存管理无非就是使用了构造函数,析构函数之类的,规范相当地复杂,如果有人觉得不复杂,那么他要么是一个初学c++的人,要么是一个学了c但是没有学好的人。
     如果将这个话题展开谈,动态内存管理其实并不是很复杂,其唯一的技术难题就是跟踪动态内存的分配,而不是具体的释放时机,一旦所有的动态分配被成功跟踪了,那么释放时机就是程序员的事情了,以前程序员由于跟踪不了动态内存分配而导致内存泄露,那实在不是程序员的错,毕竟程序越来越大越不可控,而每个人也不一定都是高手,但是如果你时刻都能得到当前分配了哪些内存,但是还是泄露,那就是你个人问题了,所以说,只要做到动态内存分配的汇总即可。Open×××的内存管理方案就是巧妙地将动态分配的内存组织成了链表,然后在“合适”的时机来统一释放,这个释放不是释放某一个内存块,而是释放被收集的所有的内存块。首先看一下这个机制的基础设施:
struct gc_entry { //gc机制的单向链表
    struct gc_entry *next;
};
struct gc_arena {//最重要的外层结构体,gc机制构建于之上
    struct gc_entry *list;
};
static inline struct gc_arena gc_new (void)
{ //分配一个gc,注意是inline,否则返回栈上的缓冲区是错误的
    struct gc_arena ret;
    ret.list = NULL; //初始化
    return ret;
}
static inline void gc_free (struct gc_arena *a)
{ //链表的释放,释放掉链表上所有的动态内存区域
    if (a->list)
        x_gc_free (a);
}
void x_gc_free (struct gc_arena *a)
{ //具体的释放动作
    struct gc_entry *e;
    e = a->list;
    a->list = NULL;
    while (e != NULL) { //遍历链表的元素,逐个释放之
        struct gc_entry *next = e->next;
        free (e);
              e = next;
        }
}
void *gc_malloc (size_t size, bool clear, struct gc_arena *a)
{  //重要的分配函数
    void *ret;
    if (a) {
        struct gc_entry *e; //注意下面分配的空间大小要加上gc_entry的大小,gc_entry负责管理
        e = (struct gc_entry *) malloc (size + sizeof (struct gc_entry));
        check_malloc_return (e);
        ret = (char *) e + sizeof (struct gc_entry); //只把除去管理数据的内存返回给调用者
        e->next = a->list; //将该块内存链接入链表
        a->list = e;
    }
...
    if (clear) //分配一块清0内存
        memset (ret, 0, size);
    return ret;
}
以上代码很清晰,下面则是使用上述机制的一个例子:
int mmalloc(struct gc_arena *gc)
{//如果下面的换成malloc(1000)的话,则瞬间就完蛋了。
        char *buf = (char *)gc_malloc (1000, 1, gc);
}
int main(int argc, char **argv)
{
        struct gc_arena gc = gc_new();
        gc.list = NULL;
        int i = 0, j = 0;
        while (1) {
                i++;
                while (j++ < 10) {
                        mmalloc(&gc);
                }
                j = 0;
                gc_free(&gc);
        }

}
何谓“合适”的时机,到底在什么时候释放呢?这实际上是个问题,答案就是需要你自己掌握,也就是说你必须知道什么时候那些分配的缓冲区没有用了,这个gc机制所做的仅仅是帮你搜集到所有的缓冲区,而不是负责帮你决定释放的时机,如果你理解linux kernel的计数器机制的话,那么一定会为这种内存管理机制叹为观止,不过说实话,即使是计数器机制也是需要程序员自己把握什么时候调用free,而在free中递减计数器,计数器机制为你做的只是控制计数器为当前正在使用该内存的路径数量,具体何时该释放还是需要程序员自己控制,实际上不要贪图任何毫无代价的自动内存管理机制,也没有那样的机制,目前实现的需要付出代价的内存管理机制主要有两种,一种是c++牺牲了简单性原则实现的利用诸如构造函数/析构函数之类的机制,它实质上是利用一些c++的固定标准来实现的,另一种则是牺牲了性能和可控性的垃圾收集机制,java使用该种方式,java虚拟机需要维护一个对象引用图,定期触发垃圾收集而将游离的图节点内存回收。可见唯一不需要付出系统代价的就是c的实现了,可是却需要程序员在写代码时付出代价,不管怎样,就简单就是美的原则来讲我宁可使用C的方法也不喜欢c++或者java那种看似简单实则臃肿的方式

转载于:https://blog.51cto.com/dog250/1271830

一个基于链表的内存管理方案相关推荐

  1. 内存管理相关【内存布局内存管理方案】

    iOS系统下的内存布局 最上面是内核区,最下面是保留区,中间是给程序加载的空间. 从高地址到低地址依次为内核区.栈.堆.静态全局区(未初始化区域.bss和已初始化区域.data).代码区.保留区: 程 ...

  2. Python基于值的内存管理真相

    Python采用基于值的内存管理方式,如果为不同变量赋值为相同值,这个值在内存中只保存一份,多个变量指向同一个值的内存空间首地址,这样可以减少内存空间的占用,提高内存利用率. Python启动时,会对 ...

  3. iOS中内存管理方案

    系统提供的有不同的内存管理方案,大致有如下三种: TaggedPointer (对于一些小对象,比如说NSNumber,NSString等采用此种方案) NONPOINTER_ISA (64位架构下i ...

  4. 一个基于 Docker 的私有云方案

    一个基于 Docker 的私有云方案 最近调研了很多 Docker 相关的项目,希望能够搭建一套稳定的基于Docker的私有云方案. 基于 Docker 的私有云,本质是一整套以 Docker 为核心 ...

  5. python采用的是基于_Python采用的是基于____的内存管理方式

    Python采用的是基于____的内存管理方式 答:值 中国大学MOOC: 四大基本设计原则是 答:对齐.重复.亲密.对比 下列不属于软件调试技术的是 答:集成测试法 短视频类APP在11点至12点. ...

  6. python基于值的内存管理方式_python内存管理方式以及深拷贝,浅拷贝

    简单开篇,手绘结尾 1.pip常用工具命令: $pip download packagename==version #下载指定版本模块,但是不安装 $pip freeze>requirement ...

  7. python基于值的自动内存管理方式是什么_Python采用的是基于值得自动内存管理方式。(2.0分)_学小易找答案...

    [多选题]下列有关关键绩效指标表述正确的是( ) [单选题]上级和员工之间以持续沟通来预防和解决员工实现绩效时可能发生的各种问题的过程,这是绩效管理的( )环节 [单选题]下列有关双因素理论的描述中, ...

  8. .net core中的高效动态内存管理方案

    .net core在新增的System.Buffers中引入了一大堆高效内存管理的类,如span和memory.内存池.本文今天这里介绍一个高效动态内存访问方案. ReadOnlySequenceSe ...

  9. python是基于什么的内存管理方式_为什么说Python采用的是基于值的内存管理模式...

    内存管理架构: 1.python的内存管理机制由两部分组成,其由PYMALLOC_DEBUG控制,在debug模式下的内存管理机制和正常模式下的内存管理模式. 2.python的内存管理机制可以抽象成 ...

最新文章

  1. linux刷新挂载信息,Linux系统下如何挂载FAT32的U盘
  2. 使用windbg定位内存问题【入门级】
  3. 分区表导入导出[未完]
  4. php MySQL快速入门_PHP 连接 MySQL
  5. cap流程图_化工工艺流程图制图图例汇编.pdf
  6. 邻值查找—算法进阶指南
  7. springboot+事务,多张表的操作事务回滚
  8. C、C++语言中参数的压栈顺序
  9. requests库学习
  10. 试题6 算法训练 数据交换(指针)
  11. python pyhook_Python——pyHook监听鼠标键盘事件
  12. matlab中变压器的仿真,基于MATLAB的稳压变压器建模与仿真
  13. 流量卡之家:拥有边缘计算的物联网才是真正的物联网
  14. 【渝粤教育】广东开放大学 电算化会计 形成性考核 (44)
  15. 世界杯开打,病毒借明星无孔不入
  16. 对《java程序员上班那点事》笔者对数组占用内存质疑
  17. Day_06 传智健康项目-移动端开发-体检预约
  18. 【为你剖析笔记本的内部结构】
  19. JAVA公路车几何图_争当老司机 深入解读自行车几何图表
  20. qzezoj 1590 买玩具

热门文章

  1. C#与matlab混合编程
  2. 添加MD5 密码加密
  3. windows xp 创建 Oracle(11G)数据库实例时写入系统日志失败解决方案
  4. .NET生成常用16、32位MD5加密的两种方法
  5. 怎么取消XP粘滞键(StickyKeys)
  6. zookeeper启动失败
  7. python Django创建数据库时can't open file 'manage.py': [Errno 2] No such file or directory
  8. SSM错误:Exception in thread “main“ java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletReque
  9. C盘文件内容及清理思路
  10. 怎么用class覆盖style样式