oom_adj
está obsoleto e é fornecido somente para fins herdados. Internamente, o Linux usa oom_score_adj
, que tem um intervalo maior: oom_adj
sobe para 15, enquanto oom_score_adj
sobe para 1.000.
Sempre que você escreve em oom_adj
(digamos 9), o kernel faz isso:
oom_adj = (oom_adj * OOM_SCORE_ADJ_MAX) / -OOM_DISABLE;
e armazena isso em oom_score_adj
. OOM_SCORE_ADJ_MAX
é 1000 e OOM_DISABLE
é -17.
Então, para 9, você receberá oom_adj=(9 * 1000) / 17 ~= 529.411
e, como esses valores são inteiros, oom_score_adj
conterá 529.
Agora, quando você ler oom_adj
, o kernel fará isso:
oom_adj = (task->signal->oom_score_adj * -OOM_DISABLE) / OOM_SCORE_ADJ_MAX;
Portanto, para 529, você obterá: oom_adj = (529 * 17) / 1000 = 8.993
e, como o kernel está usando números inteiros e aritmética inteira, isso se tornará 8.
Então, lá ... você escreve 9 e obtém 8 por causa da aritmética de ponto fixo / inteiro.