我不明白 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/