1. ホーム
  2. algorithm

[解決済み] CPUの使用率はどのように計算されますか?

2023-06-09 22:20:59

質問

私のデスクトップには、現在の CPU 使用率を表示する小さなウィジェットがあります。また、2 つのコアのそれぞれの使用量も表示されます。

私はいつも不思議に思うのですが、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 はプログラムにすべての処理時間を取らせて、自分自身のための時間を確保しないのです。 (あなたがそうさせない限り) . 言い換えれば、たとえアプリケーションがハングアップしているように見えても、OSは まだ ということです。