Na tradição da UTSL, colei no código que executa o cálculo. Aqui, nrun=sched_load()
é o total de processos "prontos para execução" neste instante e avg está apontando para uma estrutura com 3 números de ponto fixo (1,5,15 minutos). cexp são números mágicos para decair os valores por 1,5 e 15 minutos. Para referência, isso é em /usr/src/sys/kern/kern_synch.c
... que eu poderia recomendar como uma leitura fascinante.
No FreeBSD, o que mais surpreende as pessoas em relação às máquinas responsivas com altas médias de carga é que o despertar de um grande número de processos pode aumentar bastante os números. IE: se 400-ish processa todos os acordados juntos (servidores web ou servidores de banco de dados, às vezes, fazem isso.)
/*
* Compute a tenex style load average of a quantity on
* 1, 5 and 15 minute intervals.
*/
static void
loadav(void *arg)
{
int i, nrun;
struct loadavg *avg;
nrun = sched_load();
avg = &averunnable;
for (i = 0; i < 3; i++)
avg->ldavg[i] = (cexp[i] * avg->ldavg[i] +
nrun * FSCALE * (FSCALE - cexp[i])) >> FSHIFT;
/*
* Schedule the next update to occur after 5 seconds, but add a
* random variation to avoid synchronisation with processes that
* run at regular intervals.
*/
callout_reset_sbt(&loadav_callout,
SBT_1US * (4000000 + (int)(random() % 2000001)), SBT_1US,
loadav, NULL, C_DIRECT_EXEC | C_PREL(32));
}