CPU不会自行计算使用率。它可能具有使该任务更轻松的硬件功能,但这主要是操作系统的工作。因此,显然实现的细节将有所不同(尤其是在多核系统的情况下)。
总体思路是查看CPU需要执行的工作队列有多长时间。操作系统可能会定期查看调度程序,以确定其必须执行的操作数量。
这是Linux中的一个功能(从Wikipedia摘录),用于执行上述计算:
#define FSHIFT 11 #define FIXED_1 (1<<FSHIFT) #define LOAD_FREQ (5*HZ) #define EXP_1 1884 #define EXP_5 2014 #define EXP_15 2037 #define CALC_LOAD(load,exp,n) load *= exp; load += n*(FIXED_1-exp); load >>= FSHIFT;unsigned long avenrun[3];static inline void calc_load(unsigned long ticks){ unsigned long active_tasks; static int count = LOAD_FREQ; count -= ticks; if (count < 0) { count += LOAD_FREQ; active_tasks = count_active_tasks(); CALC_LOAD(avenrun[0], EXP_1, active_tasks); CALC_LOAD(avenrun[1], EXP_5, active_tasks); CALC_LOAD(avenrun[2], EXP_15, active_tasks); }}至于问题的第二部分,大多数现代操作系统都是多任务的。这意味着OS不会让程序占用所有处理时间,而不会自己占用任何处理时间(除非您让它这样做)。换句话说,即使应用程序似乎挂起,操作系统
仍然 可以占用一些时间来完成自己的工作。



