htop 显示数据内存大于常驻内存

htop 显示数据内存大于常驻内存

我不明白 htop 中如何显示进程的内存。在几乎所有进程中,M_DRS(DATA) 列显示的值都比列大M_RESIDENT

按照设置中的描述,M_RESIDENT是数据部分加上文本部分加上堆栈的使用,而是M_DRS数据部分加上堆栈的使用。

所以M_RESIDENT应该M_DRS加上文本部分,也就是说M_RESIDENT = M_DRS + M_TRS,这意味着 M_DRS < M_RESIDENT但事实并非如此,因为在大多数过程中我得到的结果恰恰相反:M_DRS > M_RESIDENT

可以解释这种行为吗?

答案1

当应用程序向内核请求内存(使用mmap系统调用)时,内核会创建内存部分(您可以在中看到/proc/[pid]/mmaps),但内核不必为该部分使用真实的物理 RAM。

首先,那里还没有加载任何数据(目前还没有),为什么要浪费物理内存?其次,数据可能会被换出。

所以:

M_DRS是所有不一定加载到物理内存中的内存部分的总和。

M_RESIDENT就是我们在物理 RAM 中所拥有的。

让我们进行实验:

#include <unistd.h>
#include <stdlib.h>
#include <string.h>

void main() {
 char* foo = malloc(1024 * 1024 * 1024); // Ask kernel for 1GB !

 for(size_t i = 0; i < 1024 * 1024 * 1024; i += 1024 * 1024 * 10) {
 memset(foo + i, 'Q', 1024 * 1024 * 100); // Load 100MB 
 sleep(2); // Sleep for a while
 }
}

当您运行该程序时,您应该看到 DATA=1GB,但 RES 要小得多,但每 2 秒就会增加一次。

这个描述过于简单了,如果你真的感兴趣,你应该读一些类似“理解 Linux 内核”的东西。

也可以看看https://darkcoding.net/software/resident-and-virtual-memory-on-linux-a-short-example/

相关内容