Я думаю, что комментарии в исходном коде уже хорошо объясняют это:
/**
* oom_badness - heuristic function to determine which candidate task to kill
* @p: task struct of which task we should calculate
* @totalpages: total present RAM allowed for page allocation
*
* The heuristic for determining which task to kill is made to be as simple and
* predictable as possible. The goal is to return the highest value for the
* task consuming the most memory to avoid subsequent oom failures.
*/
Функция oom_badness()
косвенно вызывается out_of_memory()
, которая является функцией, ответственной за обработку критического состояния нехватки памяти. Когда out_of_memory()
вызывается (например, распределителем страниц или обработчиком ошибок страницы ), он перебирает все задачи, чтобы определить их "плохость", и задачу с наибольшее значение принудительно уничтожается (фактическая цепочка вызовов составляет select_bad_process()
→ oom_evaluate_task()
→ oom_badness()
).
«Плохость» задачи зависит от нескольких факторов:
- Сколько страниц находится в его виртуальной памяти.
- Сколько записей SWAP ему принадлежит.
- Сколько памяти использует процесс ( общее число байт / размер страницы).
- Если он был уже помечен для уничтожения , поскольку он отвечает за OOM, он получает максимально возможный балл.
- Если это Процесс инициализации или поток ядра игнорируется.
В старых версиях ядра функция oom_badness()
была более сложной, например, с учетом различных коэффициентов масштабирования и бонусов " «для привилегированных процессов , но оно было обновлено, чтобы сделать его» просто и максимально предсказуемо ".