我想知道“top”命令如何计算任何进程使用的cpu百分比。
我试过在/ proc目录中读取“psinfo”二进制文件,但它没有帮助查找结果。
请提供任何有关如何完成的信息。
提前致谢。
答案 0 :(得分:9)
top
命令使用proc file system中的数据计算CPU使用率。包含CPU使用率数据的实际文件可能因平台而异。例如,在Linux中,它位于/proc/<pid>/stat
中,而对于Solaris,可以在/proc/<pid>/psinfo
中找到它。 CPU使用率计算为进程的累计CPU时间差除以更新之间测量的时间量。
对于Linux,您可以检查包含ps
,top
的{{3}}来源以及procps中的其他处理工具。 http://procps.sourceforge.net文件特别包含检索数据的功能。
对于Solaris,您可以从readproc.c检查libproc来源。 https://hg.java.net/hg/solaris~on-src/file/tip/usr/src/lib/libproc文件包含检索数据并将其存储在prog_get_info.c结构中的功能。
对于Linux,Solaris和其他人,您可以从psinfo_t
检查Unix Top来源。 machine
目录中特定于平台的源文件包含检索数据的功能。
<强>更新强>
用于检索进程的CPU时间的另一个选项(仅限Solaris)可能会传递到http://sourceforge.net/projects/unixtop系统调用的PIOCPSINFO
或PIOCSTATUS
选项。 ioctl()
选项在PIOCPSINFO
结构中返回其他进程信息。 prpsinfo_t
选项在PIOCSTATUS
结构中返回进程的状态信息。
改编自prstatus_t
的示例代码:
int main(int argc, char* argv[])
{
int fd;
prpsinfo_t info;
prstatus_t status;
char procbuf[50];
sprintf(procbuf, "/proc/%d", getpid());
fd = open(procbuf, O_RDONLY);
ioctl(fd, PIOCPSINFO, &info);
printf("Process user+sys time = %ld sec %ld nsec\n"
"Reaped children user+sys time = %ld sec %ld nsec\n",
info.pr_time.tv_sec, info.pr_time.tv_nsec,
info.pr_ctime.tv_sec, info.pr_ctime.tv_nsec);
ioctl(fd, PIOCSTATUS, &status);
printf("Process user+sys time = %ld sec %ld nsec\n"
"Sum of children's user+sys time = %ld sec %ld nsec\n",
status.pr_utime.tv_sec+status.pr_stime.tv_sec,
status.pr_utime.tv_nsec+status.pr_stime.tv_nsec,
status.pr_cutime.tv_sec+status.pr_cstime.tv_sec,
status.pr_cutime.tv_nsec+status.pr_cstime.tv_nsec);
close(fd);
exit(0);
}
注意:此代码未经测试,并且为了简单起见省略了错误检查。