首页 > 解决方案 > 我如何理解 pthread_create 内存使用情况?

问题描述

这是代码示例

它创建一个分离的 pthread

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

void *show_message( void *ptr )
{
    char *message;
    message = (char *) ptr;
    printf("[%s] start\n", message);
    int x = 3;
    for(x = 3 ; x > 0 ; --x){
        printf("%s \n", message);
        sleep(2);
    }
    printf("[%s] end\n", message);
}

int create_thread(char *message)
{
    pthread_attr_t att;
    pthread_attr_init(&att);
    pthread_attr_setdetachstate(&att, PTHREAD_CREATE_DETACHED);
    pthread_t thread;
    pthread_create(&thread, &att, show_message, (void*)message);

    return 0;
}

int main(){
    sleep(3);

    create_thread("Thread 1");

    while(1) {};

    return 0;
}

Valgrind 结果显示没有泄漏

==9872== 堆摘要:

==9872== 在退出时使用:0 个块中的 0 个字节

==9872== 总堆使用量:2 次分配,2 次释放,分配 1,296 字节

==9872==

==9872== 所有堆块都被释放——不可能有泄漏


但我读 /proc/[pid]/statm

尺寸和居民获得更高

[~] $ while [ 1 ]; do cat /proc/`pidof pthread_example`/statm; sleep 2; done

1596 218 198 1 0 50 0 <- 运行

1596 218 198 1 0 50 0

20062 218 198 1 0 18516 0 <- [线程 1] 开始

20062 218 198 1 0 18516 0

20062 218 198 1 0 18516 0

20062 299 278 1 0 18516 0 <- [线程 1] 结束

20062 299 278 1 0 18516 0


为什么 ?

标签: ubuntumemory-leakspthreads

解决方案


如果您要问为什么释放内存时进程内存大小没有减少,那实际上很简单。

当进程需要额外的内存时(例如,当您尝试分配一些内存但没有足够的内存给您时),该进程会向操作系统请求更多内存。

但是,当您释放该内存时,不需要将其实际释放回操作系统,更有可能的是在某个时候再次需要它,因此该过程将其保留以防万一。

这样想:

    A              B             C
+--------+     +--------+    +--------+
| Memory |     | Memory |    | Memory |
|    for | <-> |     in | <- |     in |
|    you |     |   heap |    |     OS |
+--------+     +--------+    +--------+

内存很可能在您分配和释放它时双向流动但它只根据需要到流动。当然,当您的进程退出时,将返回所保留的任何内容。AB CBB

请记住,这是一个概念描述,操作系统可能没有实际内存,更准确的可能是操作系统只是将您的地址空间扩展到更大的大小。实际内存由您拥有的任何虚拟内存管理器根据需要分配。


推荐阅读