Linux下proc stat详解 (linux中的proc stat)
在Linux系统中,/proc目录下存储了操作系统的各种信息,其中/proc/stat文件记录了系统运行的各项指标数据,如CPU使用率、上下文切换次数、用户进程数等。本文将详细解读/proc/stat文件的内容和意义。
/proc/stat文件格式
/proc/stat文件的顶部是汇总了整个系统所有CPU的运行数据,其余则是每个CPU的信息。文件中每行的开头都是以一个非字母开头的数据标示符,后面则跟随着该标示符的数值。
根据/proc/stat的格式,下表列出了一些常见的标示符及其含义:
| 标示符 | 含义 |
|——–|——————————|
| user | 用户级进程运行时间 |
| nice | 优先级较低的进程运行时间 |
| system | 内核级进程运行时间 |
| idle | CPU空闲时间 |
| iowt | CPU等待输入输出完成时间 |
| irq | 处理中断时间 |
| softirq| 软中断时间 |
| steal | 虚拟CPU等待真实CPU运行时间 |
| guest | 虚拟CPU运行时间 |
| guest_nice | 优先级较低的虚拟CPU运行时间 |
每个标示符的数值都代表着其所属的计时器自系统启动以来已经运行的时钟数,可以通过读取这些数值与前一次读取的数据对比来计算CPU的使用率和其它各种指标。
/proc/stat文件的解读
以下是通过/proc/stat文件来计算CPU使用率的代码:
“`c
#include
#include
int mn() {
long int user, nice, sys, idle;
long int user_diff, nice_diff, sys_diff, idle_diff;
FILE *fp;
char buf[100];
while (1) {
// 打开/proc/stat文件
fp = fopen(“/proc/stat”, “r”);
fgets(buf, sizeof(buf), fp);
// 读取CPU汇总运行时间的数据
sscanf(buf, “cpu %ld %ld %ld %ld”, &user, &nice, &sys, &idle);
// 关闭文件
fclose(fp);
// 等待1秒
sleep(1);
// 再次打开/proc/stat文件
fp = fopen(“/proc/stat”, “r”);
fgets(buf, sizeof(buf), fp);
// 读取CPU汇总运行时间的数据
sscanf(buf, “cpu %ld %ld %ld %ld”, &user_diff, &nice_diff, &sys_diff, &idle_diff);
// 关闭文件
fclose(fp);
// 计算CPU使用率
long int total_time = (user_diff + nice_diff + sys_diff) – (user + nice + sys);
long int idle_time = idle_diff – idle;
float cpu_usage = (float) (total_time – idle_time) / (float) total_time * 100.0;
printf(“CPU使用率: %.2f%%\n”, cpu_usage);
}
return 0;
}
“`
这段代码首先通过fgets()函数从/proc/stat文件中读取一行数据,该行数据包含了整个系统所有CPU的运行数据。接着使用sscanf()函数解析这行数据,提取出user、nice、sys和idle这四个数据,分别代表用户进程、优先级较低的进程、内核进程和CPU空闲时间的时钟数。
接下来,程序让当前进程等待1秒钟,然后再次读取/proc/stat文件的之一行数据,从中提取出上次读取时CPU的四个数据,以得到它们在这1秒的时间内的差值。
程序计算CPU使用率,具体的实现方式是将这1秒钟的总时钟数(total_time)减去空闲的时钟数(idle_time),并将结果除以总时钟数,这样可以得到CPU的使用率。
此外,/proc/stat文件还包含了许多其它的信息,如:
1. 上下文切换(Context Switching):上下文切换是指操作系统将CPU从一个进程转移到另一个进程的过程,其中切换的成本包括将进程的状态保存到内存中,因此上下文切换的次数越多,CPU的利用率就越低。可以通过读取/proc/stat文件中的ctxt标示符来计算上下文切换的次数。
2. 进程数:可以通过读取/proc/stat文件中的processes标示符来计算当前进程数。
3. 内存页交换(Memory Page Swapping):如果系统的物理内存已经用完,则操作系统会将部分数据从内存交换到硬盘上,以空出一些空间供新的数据使用,这个过程就是内存页交换。可以通过读取/proc/stat文件中的pswpin和pswpout标示符来计算内存页交换的次数。
4. 硬盘读写(Disk I/O):可以通过读取/proc/stat文件中的io开头的标示符来计算硬盘的读写速度和总量。