LINUX c语言 定时显示CPU,内存和硬盘的使用率

/* 
写在完成后,查找了很多资料,看到了很多方法,也看了部分top的源码,最终选择了这几种混合的方式来写,可能有更优解,不过目前这样应该够用。
--2020/12/15--  Simon
*/

需求:定期获取CPU,内存,硬盘的使用率。

  • CPU利用率:top /proc/stat

  • 内存使用率:top – sysinfo

  • 硬盘占用率:df (disk free) 还要想想 – fstatfs/statfs 系统调用

先从 CPU 利用率着手,这三项数据都已经封装了现有的指令中,如果自己写一个应该怎么着手?会有什么差异

从用户态,系统态,空闲态。

平时所说CPU利用率是指:CPU执行非系统空闲进程的时间/CPU总的执行时间即 1-CPU空闲运行时间/总运行时间。

但是这个计算方式并不具备参考意义,因为总CPU时间是机器开机以来的,事实上,为了计算CPU使用率,性能工具都会取间隔一段时间(比如5秒)的两次值,做差后,再计算这段时间的平均CPU使用率。即:
 平均CPU使用率  = 1 −  空闲时间  new  −  空闲时间  old   总  C P U  时间  new  −  总CPU 时间  old  \text { 平均CPU使用率 }=1-\frac{\text { 空闲时间 }_{\text {new }}-\text { 空闲时间 }_{\text {old }}}{\text { 总 } C P U \text { 时间 }_{\text {new }}-\text { 总CPU 时间 }_{\text {old }}}  平均CPU使用率 =1  CPU 时间 new  CPU 时间 old  空闲时间 new  空闲时间 old 
top参数详解

思考原理,IPbench的cpu_target_lukem插件参照,给程序设置一个极低的优先级,如果有任何计算任务都会打断它,如果没有计算任务,我们的程序就会占用部分CPU时间,程序运行时间上来推算CPU的空闲时间。

还有一种思路就是直接调用本地文件中的信息。

/proc/stat

linux系统的/proc目录是一种伪文件系统(虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以查看有关系统硬件及当前运行进程的信息。可以使用cat指令查看。

想要计算CPU使用率,首先要了解文件 /proc/stat中的内容

在这里插入图片描述

cpu以及0123中每行的每个参数意思解释:(以cpu为例)

user(59586):从系统启动开始累积到当前时刻,用户态的CPU时间(单位:jiffies),不包含nice值为负进程。 1jiffies=0.01秒。

nice(120):从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)。

system(264479):从系统启动开始累计到当前时刻,核心时间。(单位:jiffies)。

idle(853271):从系统启动开始累积到当前时刻,除硬盘IO等待时间意外其他等待时间。(单位:jiffies)。

iowait(16057):从系统启动开始累积到当前时刻,硬盘IO等待时间。(单位:jiffies)。

irq(13135):从系统启动开始累积到当前时刻,硬中断时间。(单位:jiffies)。

softirq(14549):从系统启动开始累积到当前时刻,软中断时间。(单位:jiffies)。

#include <stdio.h>
#include <unistd.h>

typedef struct CPU_PACKED //定义一个cpu occupy的结构体
{
   
    char name[20];  
    unsigned int user;
    unsigned int nice;
    unsigned int system;
    unsigned int idle;
}CPU_OCCUPY;

int cal_cpuoccupy(CPU_OCCUPY *O,CPU_OCCUPY *n)
{
   
    unsigned long od, nd;
    unsigned long id, sd;
    int cpu_use = 0;
    od = (unsigned long)(o->user + o->nice + o->system + o->idle);  //第一次(用户+优先级+系统+空闲)的时间再赋给od
    nd = (unsigned long)(n->user + n->nice + n->system + n->idle);  //第二次(用户+优先级+系统+空闲)的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值