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.