通过PID获取进程的CPU使用率(顶级源代码)

时间:2011-02-22 11:38:11

标签: macos cpu pid

如果我只知道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使用百分比,我需要像所有进程的空闲时间一样。

我已经花了一整天但没有任何进展。

4 个答案:

答案 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();
        }
    }
}
相关问题