linux time命令总结
1、CPU资源的统计包括实际使用时间(real time)、用户态使用时间(the process spent in user mode)、内核态使用时间(the process spent in kernel mode)。例如:下面的小程序,
#include<stdio.h>
#include <stdlib.h>#if 0
int square(int value) __attribute__((const));
#else
int square(int value);
#endif
int square(int value)
{
return value*value;
}int main(int argc, char* argv[])
{
long long i = 0;
int num = 0;for(i = 0; i < 1000000000; i++)
{
num = square(5)+i;
}
}
测试结果:
@debian69:~/algoAndSturct/selfTest$ gcc attribute005.c
@debian69:~/algoAndSturct/selfTest$ time ./a.outreal 0m3.073s
user 0m3.044s
sys 0m0.028s
核心态(Kernel Mode):
在内核态,代码拥有完全的,不受任何限制的访问底层硬件的能力。可以执行任意的CPU指令,访问任意的内存地址。内核态通常情况下,都是为那些最底层的,由操作系统提供的,可信可靠的代码来运行的。内核态的代码崩溃将是灾难性的,它会影响到整个系统。
用户态(User Mode):
在用户态,代码不具备直接访问硬件或者访问内存的能力,而必须借助操作系统提供的可靠的,底层的APIs来访问硬件或者内存。由于这种隔离带来的保护作用,用户态的代码崩溃(Crash),系统是可以恢复的。我们大多数的代码都是运行在用户态的。
我们来看看这三个的关系,这三者之间没有严格的关系,常见的误区有:
误区一: real_time = user_time + sys_time
我们错误的理解为,real time 就等于 user time + sys time,这是不对的,real time是时钟走过的时间,user time 是程序在用户态的cpu时间,sys time 为程序在核心态的cpu时间。
利用这三者,我们可以计算程序运行期间的cpu利用率如下:
%cpu_usage = (user_time + sys_time)/real_time * 100%
误区二:real_time > user_time + sys_time
一般来说,上面是成立的,上面的情况在单cpu的情况下,往往都是对的。但是在多核cpu情况下,而且代码写的确实很漂亮,能把多核cpu都利用起来,那么这时候上面的关系就不成立了。
2、time的 -v
但是简单的使用time命令并不能得到内存和I/O的统计数据。