Преобразование ядра Linux во время spin_lock и mutex_lock - PullRequest
10 голосов
/ 02 июля 2011

Когда процесс в пространстве ядра содержит spin_lock, процесс не может быть прерван из-за любого из следующих условий:

  1. Когда временной интервал процесса истощается
  2. Когда процесс с высоким приоритетом становится работоспособным
  3. Когда происходит прерывание

Однако процесс может дать процессор, если он блокирует, спит или явно вызывает schedule(),Правильно ли мое понимание?

Когда процесс в пространстве ядра содержит mutex_lock, может ли процесс быть прерван из-за вышеуказанных условий, перечисленных как 1, 2 и 3.

1 Ответ

18 голосов
/ 02 июля 2011

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

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

  • Чтобы обеспечить мьютекс локального процессора, spin_lock () вызывает preempt_disable () (в системах с упреждающим планированием), чтобы предотвратить запуск любого другого потока, пока удерживается блокировка; аналогично spin_lock_irqsave () также делает эквивалент local_irq_save () для отключения прерываний, чтобы вообще ничего не запускать на локальном процессоре.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...