将下面的代码编译链接为可执行文件 read_statm
,使用时传入需要查看的 pid
号即可。
// read_statm.c
int main(int argc, char *argv[])
{
FILE *fp;
char FILE_NAME[50] = {0};
char data_buf[50] = {0};
sprintf(FILE_NAME, "/proc/%d/statm", argv[1]);
fp = fopen(FILE_NAME, "r");
fgets(data_buf, 50, fp);
printf("VIRT\tRES\tSHR\tCODE\tLRS\tDATA\tDIRTY\n");
printf("%s\n", data_buf);
exit(0);
}
运行结果:
通过查看进程 /proc/PID/statm
文件内容,获取内存页信息,该文件含有 7 列,以内存页计算各值,如内存页大小为 4KiB,因此,将内存页的数量乘以 4,就是 KiB 计算的内存占用大小,VIRT
、RES
、SHR
、CODE
、LRS
、DATA
、DIRTY
。其中 LRS
、DIRTY
不再使用。
-
VIRT
Virtual Memory Size:进程使用的所有虚拟内存,包括代码 code、数据 data、共享库 shared libraries、被换出 swap out 到交换区和映射了但尚未载入实体内存的部分。 -
RES
Resident Memory Size:进程所占用的所有实体内存(Physical memory),不包括被换出到交换区的部分。 -
SHR
Shared Memory Size:进程可读的全部共享实体内存,并非所有部分都包含在RES
中,它反映了可能被其他进程共享的内存部分。 -
CODE
Code Size:进程所占用的实体内存中,可执行代码所占用的内存大小。驻存代码集合。 -
DATA
DATA+Stack Size:进程所占用的虚拟内存中,栈区域与非栈区域中非共享可写区域之和。