libumem使用和源码分析系列文章(一)

libumem是2001年由SUN的工程师Jeff Bonwick和Jonathan Adams开发的一个对应用程序进行内存管理的动态链接库。简单地讲,libumem通过提供一组替换C标准库的内存分配函数(malloc,free,realloc等等),从而可以使用户更容易发现和解决关于内存管理的bug。从Solaris 9(Update 3)开始,libumem作为Solaris操作系统的一个标准库提供给应用程序使用。现在libumem已经被移植到其它的平台上,这个网站(https://labs.omniti.com/labs/portableumem)不仅介绍了关于libumem的移植,并且还提供了源代码。从今天起,我打算写一组系列文章,通过对libumem的源代码分析,介绍如何使用libumem以及它的工作原理。

首先,我介绍一下如何使用libumem。这里有两个方法:
(1)通过使用LD_PRELOAD环境变量:
LD_PRELOAD=libumem.so;export LD_PRELOAD
这样就使用户程序使用的是libumem中提供的内存管理函数,而不是C标准库的函数。关于LD_PRELOAD,感兴趣的读者可以参考stackoverflow上的这篇帖子:http://stackoverflow.com/questions/426230/what-is-the-ld-preload-trick
(2)在链接程序时加上 -lumem选项。

当应用程序运行后,我们可通过以下简单的Dtrace脚本去检查程序是否使用的是libumem:

#!/usr/sbin/dtrace -qs

pid$1::malloc:entry
{
    trace(probemod);
}

这个脚本会输出使用哪个模块的malloc函数,如果输出的模块名是类似于“libumem.so.1”,那么就证明程序已经使用libumem了,否则就需要检查一下,看看问题在哪里。

《libumem使用和源码分析系列文章(一)》有9个想法

  1. 已经研究了几天umem,现在还没有入门,相关介绍太少了,sun公司的资料已经在oracle,没有付费账户没法看,一个付费账户要几十万,对umem有兴趣但是找到的资料特别少

    期盼大神能给些资料,让后辈少走一些弯路,非常感谢,可以发我邮箱1427353675@qq.com

    1. > 已经研究了几天umem,现在还没有入门,相关介绍太少了,sun公司的资料已经在oracle,没有付费账户没法看,一个付费账户要几十万,对umem有兴趣但是找到的资料特别少

      你研究umem的目标是什么?是会用就可以?还是要移植?还是自己学习?
      (1)如果是会用就可以?那么参考我这篇文章就够了;
      (2)如果要移植,或是自己学习,源码在这里:https://github.com/illumos/illumos-gate/tree/master/usr/src/lib/libumem
      我也没有任何资料,而且也好几年没碰过了,抱歉。

      1. 感谢这么快就回复了,目标是吃透这个内存库,但是没有理论框架直接啃源码是一件很困难的事情,主要是连官方文档都找不到了。

          1. 谢谢前辈的帮忙,虽然我没有去看这个视频(因为访问不了),但是依然感谢前辈的帮忙。
            1,由于工作需要,通过几周的投入,目前对umem源码内存管理部分已经分析完毕,对umem的内存管理原理已经比较清楚了。umem看完后不得不感叹jeff bonwick & jonata
            n adams的创造性,向他们致敬。
            2,后续有空我会写个umem的原理分析,有需要的小伙伴先去看umem的论文,研究透了这个论文再去看源码会事半功倍,尽管看了之后还是困惑重重,但是只要坚持投入一定可以看懂;
            https://www.usenix.org/legacy/event/usenix01/full_papers/bonwick/bonwick_html/index.html
            3,umem对内存碎片化的处理非常好,要明显优于glibc,tcmalloc,但是其也存在严重VMA碎片问题,作者是2001年写的这个库,那个时候内存比较小,所以体现不出来,现在2022年了设备内存多达32G,64G,就会出现明显的问题了。

          2. 接上:
            4,目前网上关于umem的资料已经没有了,sun公司早已经并入了oracle公司,而jeff bonwick已经离开oracle多年了,我只找到了2中这一份资料,中文资料几乎没有,大家不怎么去用umem来管理内存,只有有特殊用途的场景可能会需要使用。umem虽然2001写的,但是其思想是非常超前的,非常有创造性。

          3. 写了一篇blog:libumem内存不释放问题剖析,有兴趣可以看看。https://blog.csdn.net/u010136054/article/details/123163530?spm=1001.2014.3001.5501

发表评论

邮箱地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.