量化内存,CPU在Linux下使用C进程

如何知道,在Linux中有多lessRAM和CPU“吃”了某些过程? 以及如何找出所有运行的进程(包括守护进程和系统进程)? =)

UPD:使用C语言

使用top或ps 。

例如, ps aux会列出所有进程及其所有者,状态,使用的内存等。

编辑:要在Linux下用C来做,你需要读取proc文件系统中的进程文件。 例如, /proc/1/status包含有关init进程(始终有PID 1 )的信息:

 char buf[512]; unsigned long vmsize; const char *token = "VmSize:"; FILE *status = fopen("/proc/1/status", "r"); if (status != NULL) { while (fgets(buf, sizeof(buf), status)) { if (strncmp(buf, token, strlen(token)) == 0) { sscanf(buf, "%*s %lu", &vmsize); printf("The INIT process' VM size is %lu kilobytes.\n", vmsize); break; } } fclose(status); } 

测量一个过程使用多少ram几乎是不可能的。 难点在于,每一个公羊并不是一个进程就使用的,并不是一个进程正在使用的所有进程实际上都是“拥有”的。

例如,两个进程可以共享相同文件的映射,在这种情况下,映射核心中的任何页面都“属于”这两个进程。 但是如果这些过程中只有一个正在使用它呢?

私人页面也可以是写入时复制,如果进程已经分叉,或者如果它们已经被映射但还没有被使用(考虑一个进程已经malloc'd一个巨大的区域,但没有触及大部分的情况下)。 在这种情况下,哪个进程“拥有”这些页面?

进程也可以有效地使用缓冲区缓存的部分和许多其他类型的内核缓冲区,这些缓冲区不是由它们“拥有”的。


有两个测量可用,它们是VM大小(进程已经映射了多少内存)和驻留集大小(RSS)。 它们都没有真正告诉你一个进程正在使用多少内存,因为它们都计算共享页面,并且不计算非映射页面。

那么有答案吗? 其中一些可以通过检查/ proc(/ proc / pid / pagemap)中现在可用的页面映射结构来衡量,但是共享页面的“所有权”并不一定是一种简单的方式。

有关这方面的讨论,请参阅Linux的Documentation / vm / pagemap.txt。