如果我只知道PID,我怎样才能获得进程的CPU使用率? MAXOS X
我查看了MACOSX和的顶级实用程序源代码 我在libtop.c中找到了几个重要的函数。
/* Iterate through all processes and update their statistics. */
libtop_p_proc_table_read(boolean_t reg)
libtop_p_task_update()
/* Get CPU usage statistics. */
libtop_pinfo_update_cpu_usage()
问题在于我不明白他们如何从这个巨大的数量中获得%CPU使用率 MACOS特定的“mach内核”系统调用。 有人有解决方案吗?
我得到的源码是system_time,user_time,total_time 我total_time是从流程开始的时间还是什么? 或者也可以是total_time等于1秒。
例如我的结果:对于Opera浏览器:
pid:1214用户:653.517582sec系统:193.597306sec总计:847.114888sec
从顶级实用程序更正信息:
PID命令%CPU时间
1214- Opera 8.0 14:04.52
我不明白如何将结果转换为8.0%。 这里的总时间是用户时间和系统时间的总和。 总时间是正确的:847秒约为14分04秒 为了获得cpu使用百分比,我需要像所有进程的空闲时间一样。
我已经花了一整天但没有任何进展。
答案 0 :(得分:3)
查看https://chromium.googlesource.com/chromium/src/+/master/base/process/process_metrics_mac.cc中的GetCPUUsage(),了解如何在chrome的任务管理器中实现此功能。
答案 1 :(得分:2)
从theses函数获得的时间是此进程使用cpu的时间。
您应该考虑cpu一次只能由一个进程使用(忽略多核cpu)。
因此,要获得百分比值,您必须先询问,然后等待,最后再问第二次。
和%CPU =(TIME2 - TIME1)/ Waited_time;
如果你等了一秒钟就已经拥有了良好的%CPU
如果你有多个CPU,你可能需要除以每个CPU的cpu / core数
答案 2 :(得分:0)
查看top.c如何按CPU使用情况实现排序。 total_time - p_total_time给出进程在上一个采样间隔内使用的CPU时间。除以每个过程的这个差异的总和,你就得到了你的百分比。
顺便说一下,在Mac上使用Mac OS X阅读Mac OS X文档和Mac OS X源代码时,您可能已经注意到它们一直拼写为“Mac”和“Mac OS X”。你可能认为他们错误地将自己的操作系统的名称拼错了几百万次,但实际上,听起来很奇怪,“Mac OS”是正确的拼写,而不是“MACOS”。 Mac不是首字母缩略词。答案 3 :(得分:0)
如果我只知道PID,我怎样才能获得进程的CPU使用率? MAXOS X
在这种情况下,我尽量不限制PID。但是如果你知道PID,那就更容易了。
ps -aeo pcpu,pid,user,args|tail -n +2|sort -r|head -n 1
<强>输出:强>
2.8 207 user1 / Applications / Google Chrome.app/Contents/MacOS/Google Chrome -psn_0_20485
要在Java程序中使用它,您可以尝试:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class TopProcess {
public static void main(String[] args) throws IOException {
final String[] cmd = { "/bin/sh", "-c", "ps -aeo pcpu,pid,user,args|tail -n +2|sort -r|head -n 1" };
String process;
BufferedReader input = null;
try{
Process p = Runtime.getRuntime().exec(cmd);
input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((process = input.readLine()) != null) {
System.out.println(process);
}
}
catch (Exception ex){
ex.printStackTrace();
}
finally {
input.close();
}
}
}