说到时间利用率,就得厘清CPU的时间概念。
运行time命令
real_time:钟表时间,易收到其他程序的影响,因为可能包括其他程序运行的时间,阻塞和等待时间。
user_time:运行在用户态的CPU时间,即用户程序运行的真正时间。
sys_time:运行在内核态的CPU时间,即操作系统的运行时间,这时候用户程序往往等待。
误区一:real_time = user_time + sys_time
忽略了等待时间。
单核CPU时间利用率:%cpu_usage = (user_time + sys_time) / real_time * 100%
误区二:real_time >= user_time + sys_time
不适用多核CPU
为什么CPU时间会有以上分类?这就涉及到了用户态和内核态。
内核态(Kernel Mode):CPU运行操作系统时的状态,在内核态执行的指令是特权指令。代码可以执行任何指令,操作任何硬件。一般是指操作系统代码的执行,如果崩溃往往会死机。
In Kernel mode, the executing code has complete and unrestricted access to the underlying hardware. It can execute any CPU instruction and reference any memory address. Kernel mode is generally reserved for the lowest-level, most trusted functions of the operating system. Crashes in kernel mode are catastrophic; they will halt the entire PC.
用户态(User Mode):CPU运行用户程序时的状态,在用户态执行的指令是非特权指令。代码不能直接操作硬件,需要执行system calls让操作系统去做。
In User mode, the executing code has no ability to directly access hardware or reference memory. Code running in user mode must delegate to system APIs to access hardware or memory. Due to the protection afforded by this sort of isolation, crashes in user mode are always recoverable. Most of the code running on your computer will execute in user mode.
系统调用:用户程序请求操作系统暴露的API,CPU进入内核态,执行特权指令,执行系统功能。
内核态和用户态其实是CPU程序状态字的一个标志位,如此区分的好处是,隔离保护,使系统更稳定。
网友评论