A carga é o número médio de processos executáveis. man 3 getloadavg
diz:
The getloadavg() function returns the number of processes in the system run queue averaged over various periods of time. Up to nelem samples are retrieved and assigned to successive elements of loadavg[].
The system imposes a maximum of 3 samples, representing averages over the last 1, 5, and 15 minutes, respectively.
Você também pode obter as mesmas informações executando sysctl vm.loadavg
.
Assumindo que o Mac OS X 10.7.2, a função getloadavg
chama este código aqui (procure pela segunda ocorrência de sysctl_loadavg
), que, em essência, retorna o valor atual de averunnable
.
Isso, por sua vez, é definido aqui :
struct loadavg averunnable =
{ {0, 0, 0}, FSCALE }; /* load average, of runnable procs */
Este arquivo também define compute_averunnable
, que calcula o novo valor ponderado de averunnable
.
O arquivo de cabeçalho do agendador sched.h declara como extern
, e todas as implementações do planejador em xnu-1699.24.8/osfmk/kern/sched_*.c
periodicamente o chamam por compute_averages
em sched_average.c .
O argumento para compute_averunnable
, é sched_nrun
em sched_average.c
, obtendo seu valor de sched_run_count
em sched.h
.
Este número é modificado pelas macros sched_run_incr
e sched_run_decr
, usadas exclusivamente no arquivo sched_prim.c
, que são as primitivas de agendamento responsáveis por desbloquear, despachar etc. tópicos.
Então, para recapitular:
Ele simplesmente usa o número de threads executáveis para calcular as médias de carga em intervalos de 5 segundos.
Embora os sistemas sejam totalmente diferentes, acho difícil acreditar que o Linux tenha sempre cargas menores que o OS X. De fato, parece que o Linux simplesmente mostra um valor diferente .
Citando Wikipedia :
On modern UNIX systems, the treatment of threading with respect to load averages varies. Some systems treat threads as processes for the purposes of load average calculation: each thread waiting to run will add 1 to the load. However, other systems, especially systems implementing so-called N:M threading, use different strategies, such as counting the process exactly once for the purpose of load (regardless of the number of threads), or counting only threads currently exposed by the user-thread scheduler to the kernel, which may depend on the level of concurrency set on the process.
A julgar pelo artigo , o Linux realmente usa o número de processos que são executáveis ao contrário dos threads do XNU.
Como cada processo executável tem pelo menos um thread executável, os valores médios de carga no OS X irão, assumindo um cálculo de média de carga equivalente (que não me preocupei em verificar), sempre em menos grande, já que as contagens de itens nas quais elas são baseadas são diferentes.