Нагрузка - это среднее количество запущенных процессов. man 3 getloadavg
говорит:
Функция getloadavg() возвращает число процессов в очереди выполнения системы, усредненное за различные периоды времени. До нескольких выборок извлекается и присваивается последовательным элементам loadavg [].
Система накладывает максимум 3 выборки, представляющих средние значения за последние 1, 5 и 15 минут, соответственно.
Вы также можете получить ту же информацию, запустив sysctl vm.loadavg
.
Предполагая Mac OS X 10.7.2, функция getloadavg
вызывает этот код здесь (поиск второго вхождения sysctl_loadavg
), который, по сути, возвращает текущее значение averunnable
.
Это, в свою очередь, определяется здесь:
struct loadavg averunnable =
{ {0, 0, 0}, FSCALE }; /* load average, of runnable procs */
Этот файл также определяет compute_averunnable
, который вычисляет новое взвешенное значение averunnable
.
Заголовочный файл планировщика sched.h объявляет его как extern
, и все реализации планировщика в xnu-1699.24.8/osfmk/kern/sched_*.c
периодически вызывают его через compute_averages
в sched_average.c.
Аргумент для compute_averunnable
, sched_nrun
в sched_average.c
, получает его значение из sched_run_count
в sched.h
.
Этот номер изменяется макросами sched_run_incr
и sched_run_decr
, используемыми исключительно в файле sched_prim.c
, которые являются примитивами планирования, отвечающими за разблокировку, диспетчеризацию и т.д. Потоков .
Итак, резюмируем:
Он просто использует количество выполняемых потоков для вычисления средних значений нагрузки с интервалом в 5 секунд.
Хотя системы совершенно разные, мне трудно поверить, что Linux всегда имеет более низкие нагрузки, чем OS X. На самом деле, похоже, что Linux просто показывает другое значение.
Цитируя Википедию:
В современных системах UNIX обработка потоков по отношению к средним значениям нагрузки варьируется. Некоторые системы рассматривают потоки как процессы для вычисления среднего значения нагрузки: каждый ожидающий выполнения поток добавляет 1 к нагрузке. Однако другие системы, особенно системы, реализующие так называемую потоковую обработку N: M, используют разные стратегии, такие как подсчет процесса ровно один раз с целью загрузки (независимо от количества потоков) или подсчет только потоков, отображаемых в данный момент пользователем. -поток в ядро, который может зависеть от уровня параллелизма, установленного в процессе.
Судя по этой статье, Linux действительно использует количество процессов, которые могут быть запущены, в отличие от потоков XNU.
Поскольку каждый запускаемый процесс имеет хотя бы один выполняемый поток, средние значения нагрузки в OS X будут, при условии вычисления эквивалентной средней нагрузки (который я не удосужился проверить), всегда быть по крайней мере такими же большими, поскольку элемент считает, что они ' на основе разные.