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来说,不会影响到系统正常的运行,但是这种纰漏不查出来,以后导致的危险会更大。
  • 相关阅读:
    同库 不同表更新
    js 随机时间
    转 vagrant package[打包命令]详解
    mysql 批量更新与批量更新多条记录的不同值实现方法 (转)
    vagrant up时提示 Authentication failure. Retrying
    vagrant 错误记录
    签名保存
    linux下svn命令大全
    linux 搭建SVN服务器,为多个项目分别建立版本库并单独配置权限
    log file sync
  • 原文地址:https://www.cnblogs.com/Lifehacker/p/memory_allocation_difference_between_freebsd_and_linux.html
Copyright © 2011-2022 走看看