zoukankan      html  css  js  c++  java
  • 从一段代码里看FreeBSD与Linux内存分配的不同

    唉,拖延症无以复加了。

    最近,公司移植服务器端游戏引擎到Linux上的时候,遇上了段错误。问题代码大略如下:

    char *arr = malloc(len);
    ...
    if (IsInvalid(arr[0])){
        arr++;
    }
    ...
    free(arr);

    很明显,对操作系统分配的内存块进行了指针操作后,再扔回到free函数进行释放,是会导致异常行为的。但是,该引擎的代码已经有较长的历史了,为什么在FreeBSD上没有遇到问题呢?

    这主要是因为FreeBSD与Linux的内存分配机制不同引起的。

    Linux的内存分配实现:采用双向链表,每个节点是一大块可以使用的空闲内存,节点头部含有块大小信息。
     
    FreeBSD的内存分配实现:应该是采用bitmap图配合数组实现的,通过bitmap标记这块内存已经分配。
     
    Linux严格要求,free时传入的ptr,一定是malloc分配的内存(否则找不回来这个块的大小)。
     
    FreeBSD没有这个要求,但是当free的指针与malloc的指针距离比较远的时候,泄漏会很严重,甚至比分配的内存还要多,这个要查查。
     
    因此,多一个字节,少一个字节,对于依赖bitmap图进行标记的FreeBSD来说,不会影响到系统正常的运行,但是这种纰漏不查出来,以后导致的危险会更大。
  • 相关阅读:
    luogu2253 好一个一中腰鼓!
    luogu2948 滑雪课
    luogu1556 幸福的路
    luogu1900 自我数
    luogu1632 点的移动
    luogu1999 高维正方体
    树状数组模板
    杜教筛
    [比赛|考试] 9月第一周的考试
    历年NOIP真题总结
  • 原文地址:https://www.cnblogs.com/Lifehacker/p/memory_allocation_difference_between_freebsd_and_linux.html
Copyright © 2011-2022 走看看