在Linux下使用C语言量化进程的RAM和CPU使用情况

4
如何在Linux中查找某个进程占用了多少RAM和CPU资源?如何查找所有正在运行的进程(包括守护进程和系统进程)? =)
更新:使用C语言。

应该是命令行还是图形界面? - thejh
应该是一段代码片段或类似的东西 =) - shybovycha
2个回答

6
使用 topps 命令。
例如,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);
}

嗯...那么如何使用C语言使其更方便呢?=) - shybovycha
哇!太棒了!非常感谢!我已经开始写一些简单的代码了,但还是谢谢! - shybovycha

2
测量进程使用多少内存几乎是不可能的。难点在于,每个内存块都不仅被一个进程使用,并且进程正在使用的所有内存并非实际上都属于它。
例如,两个进程可以共享同一文件的映射,此时映射中的任何页面都将“属于”这两个进程。但是如果只有其中一个进程在使用它呢?
私有页面也可以是写时复制的,如果进程已经分叉,或者如果它们已经被映射但尚未使用(考虑进程malloc了一个巨大的区域但尚未触及大部分内容的情况)。在这种情况下,哪个进程“拥有”这些页面?
进程还可以有效地使用缓冲区高速缓存和许多其他类型的内核缓冲区,它们并不是由它们所“拥有”的。
有两个可用的测量值,即VM Size(进程当前映射的内存量)和常驻集大小(RSS)。它们都不会真正告诉您进程使用了多少内存,因为它们都计算共享页面,而且都不计算未映射的页面。
那么有答案吗?其中一些可以通过检查/proc(/proc/pid/pagemap)中现在可用的页映射结构来测量,但是并不一定有简单的方法来共享共享页面的“所有权”。
请参阅Linux的Documentation/vm/pagemap.txt以了解此问题的讨论。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接