【问题标题】:pthread mutexattr process-shared memory leakpthread mutexattr 进程共享内存泄漏
【发布时间】:2017-02-10 21:20:42
【问题描述】:

根据pthread_mutexattr_init 的手册页,通过设置互斥体的process-shared 属性(使用pthread_mutexattr_setpshared),它允许互斥体在创建它的进程的生命周期之外存在:

特别是,这些进程可能存在于初始化进程的生命周期之外。

那么,如果我在mmap(2)d 文件中创建一个多个进程可以访问的互斥锁,那么我在unlink(2) 文件中创建了一个互斥锁,这会导致内核持久性内存泄漏吗?如果是这样,从实现的角度来看,僵尸互斥体的数据究竟位于何处?

【问题讨论】:

    标签: linux memory-leaks pthreads mutex


    【解决方案1】:

    Cinolt,你为什么认为 linux.die.net 发布了 linux 手册页?你有https://linux.die.net/man/3/pthread_mutexattr_init 链接,但很难找到 linux.die.net 找到文本的位置;未列出作者和日期;并且页面上有注释:

    序言

    本手册页是 POSIX 程序员手册的一部分。此接口的 Linux 实现可能不同(有关 Linux 行为的详细信息,请参阅相应的 Linux 手册页),或者该接口可能未在 Linux 上实现。

    有 Michael Kerrisk 的 man7.org 作为 linux 手册页项目的主页:https://www.kernel.org/doc/man-pages/ 这是 pthread_mutexattr_init 的人 http://man7.org/linux/man-pages/man3/pthread_mutexattr_init.3p.html。它很短,没有关于泄漏的信息。

    在 POSIX 中,某些实现可能会使用一些内核结构来保存 mutexattr 属性;为了使此类实现没有内存泄漏,POSIX 要求程序员销毁所有创建的 attrs。

    http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_mutexattr_init.html 上没有泄漏(存在于进程生命周期之外)警告 - 单一 UNIX® 规范,版本 2 - 源自 POSIX 线程扩展 (1003.1c-1995)

    但它在http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_mutexattr_destroy.html 中(The Open Group Base Specifications Issue 6 - IEEE Std 1003.1, 2004 Edition);以 die.net 页面上的示例为例:

    使用 PTHREAD_PROCESS_SHARED 进程共享属性初始化的同步变量可以由任何有权访问它的进程中的任何线程操作。特别是,这些进程可能存在于初始化进程的生命周期之外。例如,下面的代码在一个映射文件中实现了一个简单的计数信号量,可以被许多进程使用。

    在 GNU glibc 的实际实现中,通常存在于 Linux 变体中 (NPTL - https://en.wikipedia.org/wiki/Native_POSIX_Thread_Library),没有额外的内核结构分配:

    http://code.metager.de/source/xref/gnu/glibc/nptl/pthread_mutexattr_init.c

    24 __pthread_mutexattr_init (pthread_mutexattr_t *attr)
    26   if (sizeof (struct pthread_mutexattr) != sizeof (pthread_mutexattr_t))
    27     memset (attr, '\0', sizeof (*attr));
    28
    32   ((struct pthread_mutexattr *) attr)->mutexkind = PTHREAD_MUTEX_NORMAL;
    

    而破坏只是 NOP:http://code.metager.de/source/xref/gnu/glibc/nptl/pthread_mutexattr_destroy.c

    22 int
    23 __pthread_mutexattr_destroy (pthread_mutexattr_t *attr)
    24 {
    25   return 0;
    26 }
    

    【讨论】:

    • 您提供的代码是针对 pthread_mutexattr_destroy 的,它只破坏 mutexattr,而不是 mutex 本身。 pthread_mutex_destroy 的来源看起来有点 NOP-ish,但不确定。
    • 您的问题是关于 mutexattr 和错误的手册页。 mutex_destroy code.metager.de/source/xref/gnu/glibc/nptl/… 包含:stap 探针(用于跟踪工具 stap 的条目;如果没有运行跟踪,则为 nop),检查某些互斥体的互斥体使用计数器,并将互斥体类型重置为不正确的类型。因此,NPTL 中的互斥体也没有额外的内存;并且它不需要释放内核内存。在 glibc 的 NPTL 中,mutex 和 mutexattr 都是无泄漏的。
    猜你喜欢
    • 2012-10-19
    • 2012-06-22
    • 2019-01-08
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多