在我的桌面上,我有一个小部件,可以告诉我当前的CPU使用率。它还显示了我两个内核中每个内核的用法。
我一直想知道,CPU如何计算使用了多少处理能力?另外,如果CPU挂断了一些密集的计算,那么它(或处理此活动的任何对象)如何检查使用情况而又不挂断?
CPU不会自行计算使用率。它可能具有使该任务更轻松的硬件功能,但这主要是操作系统的工作。因此,显然实现的细节将有所不同(尤其是在多核系统的情况下)。
总体思路是查看CPU需要执行的工作队列有多长时间。操作系统可能会定期查看调度程序,以确定其必须执行的操作数量。
这是Linux中的一个功能(从Wikipedia摘录),用于执行上述计算:
#define FSHIFT 11 /* nr of bits of precision */ #define FIXED_1 (1<<FSHIFT) /* 1.0 as fixed-point */ #define LOAD_FREQ (5*HZ) /* 5 sec intervals */ #define EXP_1 1884 /* 1/exp(5sec/1min) as fixed-point */ #define EXP_5 2014 /* 1/exp(5sec/5min) */ #define EXP_15 2037 /* 1/exp(5sec/15min) */ #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; /* fixed-point */ 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不会让程序占用所有处理时间,而不会自己占用任何处理时间(除非您让它这样做)。换句话说,即使应用程序似乎挂起,操作系统 仍然 可以占用一些时间来完成自己的工作。