我如何了解pthread_create的内存使用情况?

时间:2018-10-30 07:40:45

标签: ubuntu memory-leaks pthreads

这是代码示例

它会创建一个分离的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


为什么?

1 个答案:

答案 0 :(得分:1)

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

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

但是,当您释放该内存时,并不需要将其真正重新获得给操作系统,更可能是在某个时候再次需要它,因此该过程将其保持不变以防万一。

这样想:

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

分配和释放内存时,内存可能在AB之间双向流动,但只能从流出 {{ 1}}至C。当然,当您的进程退出时,将返回B中保留的任何内容。

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