Дивіться на kernel / sched / loadavg.c, який має тривалий і відмінний коментар на початку, пояснюючи виведення середнього навантаження від експоненціально занепадуючого середнього числа запущених ниток ("черга запуску") плюс кількість безперебійних потоків (очікування на введення / вивід або очікування на замок).
Ось суть коментаря, але його варто прочитати повністю:
* The global load average is an exponentially decaying average of
* nr_running + nr_uninterruptible.
*
* Once every LOAD_FREQ:
* nr_active = 0;
* for_each_possible_cpu(cpu)
* nr_active += cpu_of(cpu)->nr_running +
* cpu_of(cpu)->nr_uninterruptible;
* avenrun[n] = avenrun[0] *
* exp_n + nr_active *
* (1 - exp_n)
Реальне життя робить код дещо складним: лічильники на процесор, нестакісні ядра, центральні процесори, відсутність коду з плаваючою точкою, що вимагає фіксації точки exp (n). Але неважко помітити, що всі вони працюють на шляху до сумлінної реалізації методу, описаного в коментарі.
Ви зауважите, що Linux рахує нитки , а не лише процеси, що відповідає на ваше запитання.