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

5

如果我只知道进程的PID,如何获取该进程的CPU使用率? MACOS X

我查看了MACOSX的top实用程序源代码,并在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() 

问题在于我不明白他们如何从这么多MACOS专用的“mach kernel”系统调用中获取%CPU使用率。有人有解决方案吗?
在源代码中,他们获取了系统时间、用户时间和总时间。我想知道总时间是从进程启动开始计算的还是等于1秒钟。例如,我的结果是:对于Opera浏览器: pid:1214 user:653.517582秒 system:193.597306秒 total:847.114888秒
从top实用程序中获得的正确信息:
PID COMMAND %CPU TIME 1214- Opera 8.0 14:04.52
我不明白如何将我的结果转换为8.0%。这里的总时间是用户时间和系统时间的总和。总时间是正确的:847秒约为14分04秒。要获取CPU使用率百分比,我需要所有进程的空闲时间之类的东西。
我已经花了整整一天的时间,但没有任何进展。

你目前能输出什么?也许你需要自己计算百分比。 - Joseph Le Brech
我已经更新了我的初始帖子并添加了示例数据。 - Vlad
我唯一的想法是:我应该获取系统中所有进程的total_time总和(这个总和值将为100%(“sum_all”))。然后,我应该获取我的进程的总时间,并计算它占“sum_all”的百分比。 - Vlad
4个回答

3

2

如果我只知道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();
        }
    }
}

2
这些函数返回的时间是进程使用CPU的时间。
需要注意的是,CPU一次只能被一个进程使用(忽略多核CPU)。
所以要获得百分比值,您需要先询问一次,然后等待一段时间,最后再询问一次。
% CPU =(TIME2-TIME1)/等待时间;
如果您恰好等待一秒钟,那么您已经有了正确的% CPU。
如果您有多个CPU,则可能需要除以CPU /每个CPU的核心数。

0

看看top.c如何实现按CPU使用率排序。total_time减去p_total_time给出了进程在最后一个采样间隔内使用的CPU时间。将每个进程的此差别之和除以此,即可得到百分比。

顺便提一句,在Mac OS X上阅读Mac OS X文档和源代码时,您可能已经注意到它们一贯拼写为“Mac”和“Mac OS X”。您可能认为他们只是拼错了自己的操作系统名称几百万次,但实际上,“Mac OS”是正确的拼写,而不是“MACOS”。Mac不是缩写。


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