linux下C语言实现求CPU利用率

第一节   祸起

本来就是想通过写个小程序测试CPU利用率从而可以检验其他的工具性能之类的数据,后来参照IPbench中的cpu_target_lukem插件实现我们的功能,原理简单:就是我们给程序设置了极低的优先级,如果有任何计算任务都会打断它,而如果没有计算任务,我们的程序就会占用cpu时间,所以我们的程序的运行时间基本上可以算作CPU的闲暇时间。

所以我们计算总的CPU利用率的方法就是  : CPU利用率 = 1 - 程序占用cpu时间/程序总的运行时间。

主要功能实现代码如下:

  1.     x0 = get_cycles();        //last cycle count values  
  2.   
  3.     while (calc) {  
  4.         x1 = x0;              //last cycle count values gives to x1  
  5.         x0 = get_cycles();    //the current  count values  
  6.   
  7.         delta = x0 - x1;      // ∆t  
  8.         total += delta;       //adds ∆t to a running total  
  9.   
  10. /* If the delta looks like less than a context switch,add this to idle time; otherwise add it to busy time */  
  11.         if (delta < PROFILE_CONTEXT_COST)  
  12.             idle += delta;  
  13.   
  14.         timer_buffer.idle = idle;  
  15.         timer_buffer.total = total;  
  16.     }  

从而本程序中的CPU利用率 = (1- timer_buffer.idle/timer_buffer.total)*100 %,

之后我们编译运行本程序,程序输出为:

[11:43.32] dbg: Average CPU time is 5.2
[11:43.34] dbg: Average CPU time is 5.2

这时候我们使用 " ps -au "命令,会找到这一条信息:  
long     11741  95.7  0.0  19668   520 pts/16   SNl+ 11:40   2:58 ./a.out
熟悉ps命令的童鞋们知道,
long该进程所属用户;11741该进程的PID号;95.7表示该进程的CPU占用率为95.7%;0.0表示该进程的物理内存占用率为0%;19668表示该进程占用了多少虚拟内存量;520表示该进程占用了多少固定内存量;pts/16表示登陆端口;SNl+和上面介绍的进程状态一样(R/S/D/T/Z进程);11:40该进程触发启动的时间; 2:58表示该进程占用CPU的时间;./a.out表示触动该进程的命令 。

所以ps命令显示的是我们a.out的CPU利用率高达95.7%(也就是说95.7%CPU都是闲暇的,所以我们的程序测得CPU利用率为5.2% 也相差不大)。


接着,我做了第二个测试,我把a.out拷贝了一份b.out,同时运行他们我们会看到如下信息:

a.out 显示的 :
[11:47.50] dbg: Average CPU time is 6.1
[11:47.52] dbg: Average CPU time is 6.1 

b.out 显示的s :
[11:48.20] dbg: Average CPU time is 10.2
[11:48.22] dbg: Average CPU time is 10.2

这时候我使用 "ps -au" 再查看a.out和b.out信息如下:
long     11741 94.1  0.0  19668   520 pts/16   SNl+ 11:40   7:26 ./a.out
long     11905
90.9  0.0  19668   516 pts/17   SNl+ 11:46   2:08 ./b.out

卧槽,顿时崩溃啊!到了这,我产生了三个疑问:第一、为毛运行a.out和b.out显示的CPU利用率不一样……第二、为毛在ps中显示的a.out和b.out的CPU利用率不一样?第三、为毛ps中a.out和b.out的CPU利用率分别为94.1%和90.0%,而两者加一起远远大于100%?!!我晕了,那Linux到底是如何定义CPU利用率的呢?

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux 系统中计算进程 CPU 利用率的公式如下: CPU 利用率 = 100 * (进程使用的 CPU 时间 / 系统总 CPU 时间) 其中,进程使用的 CPU 时间指的是进程在 CPU 上运行的时间,包括用户态和内核态的时间。系统总 CPU 时间指的是系统中所有 CPU 的累计时间。 以下是用 C 语言实现该公式的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define BUF_SIZE 1024 int main(int argc, char* argv[]) { if (argc != 2) { fprintf(stderr, "Usage: %s <pid>\n", argv[0]); exit(EXIT_FAILURE); } char stat_file[BUF_SIZE]; snprintf(stat_file, BUF_SIZE, "/proc/%s/stat", argv[1]); FILE* fp = fopen(stat_file, "r"); if (!fp) { perror("fopen"); exit(EXIT_FAILURE); } unsigned long utime, stime, cutime, cstime; fscanf(fp, "%*d %*s %*c %*d %*d %*d %*d %*d %*u " "%*u %*u %*u %*u %lu %lu %lu %lu", &utime, &stime, &cutime, &cstime); fclose(fp); unsigned long long total_time = utime + stime + cutime + cstime; unsigned long long system_uptime = 0; fp = fopen("/proc/uptime", "r"); if (fp) { fscanf(fp, "%llu", &system_uptime); fclose(fp); } unsigned long long cpu_time = sysconf(_SC_CLK_TCK) * system_uptime; double cpu_usage = 100.0 * total_time / cpu_time; printf("CPU usage: %.2f%%\n", cpu_usage); return 0; } ``` 该程序的输入参数为进程 PID,它会读取 `/proc/PID/stat` 文件中的 CPU 时间信息,并根据系统启动时间计算出系统总 CPU 时间,最终输出进程的 CPU 利用率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值