Выгрузка ядра при удержании спинлока - PullRequest
2 голосов
/ 07 марта 2011

Если в ядре Linux включено вытеснение ядра при удержании спин-блокировки, как может произойти взаимная блокировка?

1 Ответ

4 голосов
/ 07 марта 2011

Прерывание ядра не гарантирует отсутствие тупика.

Поток может по-прежнему удерживать блокировку, даже не снимая ее, и это все равно приведет к тупику, если какой-то другой поток захочет получить такую ​​же блокировку.Поток, удерживающий блокировку, должен решить освободить ее, чтобы избежать взаимоблокировок.То есть поток или какая-то другая логика должна выгрузить поток и , чтобы он снял блокировку.Само ядро ​​не может заставить поток снять блокировку.

Ядро просто может запланировать запуск других потоков, но если какой-то другой поток зависит от завершения первого потока, этот поток также будет заблокирован.

Например:

Поток A ожидает блокировки для некоторого общего ресурса, который получил поток B.

Поток A получает приоритет, и поток B. становится запланированным.*

Поток B ожидает блокировки для некоторого общего ресурса, который удерживает поток A.

Тупик.Ни поток A, ни поток B не могут прогрессировать.

Чтобы выйти из тупика, нужно что-то вытеснить из потока A или B, чтобы снять блокировку.Прерывание ядра не может этого сделать.

...