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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何理解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
", message);
    int x = 3;
    for(x = 3 ; x > 0 ; --x){
        printf("%s 
", message);
        sleep(2);
    }
    printf("[%s] end
", 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


为什么?

答案

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

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

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

想一想:

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

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

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

以上是关于我如何理解pthread_create内存使用情况?的主要内容,如果未能解决你的问题,请参考以下文章

pthread_create() 和内存泄漏

正确使用pthread_create,防止内存泄漏

pthread_create 使用 85MB VIRT 而不是 8MB VIRT

pthread_create:分配(malloc)将整数作为最后一个参数传递的优势?

Google Cloud Platform:如何监控VM实例的内存使用情况

pthread_create中Resource temporarily unavailable问题