Я новичок в Linux и читаю книгу о драйверах устройств для Linux от Rubini & Corbet. Меня смущает одно утверждение, относящееся к spinlocks
; в книге говорится
Если бы непреодолимая однопроцессорная система когда-либо переключилась на блокировку, она бы вращалась вечно; ни один другой поток никогда не сможет получить доступ к ЦП для снятия блокировки. По этой причине операции спин-блокировки в однопроцессорных системах без включенного приоритетного прерывания оптимизированы так, чтобы ничего не делать, за исключением тех, которые изменяют статус маскирования IRQ.
Далее в книге говорится
Случай вытеснения ядра обрабатывается самим кодом спин-блокировки. Каждый раз, когда код ядра удерживает спин-блокировку, приоритетное отключение отключается на соответствующем процессоре. Даже однопроцессорные системы должны отключать приоритетное прерывание таким образом, чтобы избежать состояний гонки.
Вопрос: В однопроцессорной системе, если приоритет ядра отключен всякий раз, когда код ядра (выполняющийся от имени пользовательского процесса) удерживает спин-блокировку, то как может другой процесс когда-либо получить шанс запустить и, следовательно, попытаться получить спин-блокировку? Почему ядро Linux отключает вытеснение ядра всякий раз, когда код ядра содержит спин-блокировку?