Смотрите 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 считает потоки , а не только процессы, которые отвечают на ваш вопрос.