ubuntu - 我如何理解 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
为什么 ?
解决方案
如果您要问为什么释放内存时进程内存大小没有减少,那实际上很简单。
当进程需要额外的内存时(例如,当您尝试分配一些内存但没有足够的内存给您时),该进程会向操作系统请求更多内存。
但是,当您释放该内存时,不需要将其实际释放回操作系统,更有可能的是在某个时候再次需要它,因此该过程将其保留以防万一。
这样想:
A B C
+--------+ +--------+ +--------+
| Memory | | Memory | | Memory |
| for | <-> | in | <- | in |
| you | | heap | | OS |
+--------+ +--------+ +--------+
内存很可能在您分配和释放它时双向流动,但它只根据需要从到流动。当然,当您的进程退出时,将返回所保留的任何内容。A
B
C
B
B
请记住,这是一个概念描述,操作系统可能没有实际内存,更准确的可能是操作系统只是将您的地址空间扩展到更大的大小。实际内存由您拥有的任何虚拟内存管理器根据需要分配。
推荐阅读
- php - 不支持的文本语言:自然语言理解 API
- javascript - 如何为 jQuery/JS 函数编写 mocha/chai 测试用例
- python - 在循环期间将数字附加到某些列表
- r - R中函数内的并行化——避免将对象自动导出到集群
- javascript - Javascript,cookie点击器计数器未更新
- sql - 尝试使用两个内连接向 sql 添加新值
- php - 只有当条件为真时,如何内连接两个表?
- r - 随机森林每次运行混淆矩阵的准确性结果在 R 中发生变化。如何确保测试数据的准确性
- java - Java根据特定列更改数组元素顺序
- c# - 为什么在更新模型的子列表时,EF Core 在删除之前插入而不是先删除再插入?