小编典典

如何计算CPU使用率?

algorithm

在我的桌面上,我有一个小部件,可以告诉我当前的CPU使用率。它还显示了我两个内核中每个内核的用法。

我一直想知道,CPU如何计算使用了多少处理能力?另外,如果CPU挂断了一些密集的计算,那么它(或处理此活动的任何对象)如何检查使用情况而又不挂断?


阅读 489

收藏
2020-07-28

共1个答案

小编典典

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不会让程序占用所有处理时间,而不会自己占用任何处理时间(除非您让它这样做)。换句话说,即使应用程序似乎挂起,操作系统
仍然 可以占用一些时间来完成自己的工作。

2020-07-28