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

问题描述 投票:0回答:1

这是代码示例

它创建了一个独立的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个allocs,2个frees,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


为什么?

ubuntu memory-leaks pthreads
1个回答
1
投票

如果你问为什么在释放内存时进程内存大小没有减少,那实际上非常简单。

当进程中需要额外的内存时(例如当你尝试分配一些内存但没有足够的内存可以提供给你时),进程会从操作系统请求更多的内存。

但是,当你释放内存时,并不要求它实际上被重新发布回操作系统,更有可能的是它会在某个时候再次需要,所以这个过程会保留它以防万一。

想一想:

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

当你分配并释放它时,内存可能会在AB之间流动,但它只会根据需要从C流向B。当然,当你的进程退出时,B中的任何内容都将被退回。

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

© www.soinside.com 2019 - 2024. All rights reserved.