Ответ 1
В текущих реализациях спиновых блокировок используются два совершенно отдельных механизма для обеспечения взаимного исключения, один для решения проблемы межпроцессорного исключения и один для работы с потоками локальных процессоров и обработчиками прерываний.
-
Существует сам spin_lock, который существует только для предоставления мьютекса между двумя или более процессорными ядрами. Любой процессор, который блокирует блокировку блокировки, в основном застревает, пока другой процессор не освободит его. Спин-блокировки не предназначены для однопроцессорных систем, кроме как для увеличения вероятности полного тупика, поэтому обычно удаляются при компиляции ядра.
-
Чтобы обеспечить локальный процессор mutex, spin_lock() вызывает preempt_disable() (в системах с предварительным упреждением планирования), чтобы предотвратить запуск любого другого потока во время блокировки; Аналогично, spin_lock_irqsave() также выполняет эквивалент local_irq_save(), чтобы отключить прерывания, чтобы что-то еще не выполнялось на локальном процессоре.
Как видно из вышесказанного, использование спин-блокировок может привести к всплеску всей машины, так что блокировки спина должны использоваться только в течение очень коротких периодов времени, и вы никогда не должны делать ничего, что могло бы привести к перепланированию, удерживая блокировку.
Случай с mutex_lock совершенно другой - затрагиваются только потоки, пытающиеся получить доступ к блокировке, и если поток попадает в заблокированный мьютекс, тогда произойдет перепланирование. По этой причине mutex_locks не могут использоваться в контексте прерывания (или других атомных).