Почему блокировки используются в обработчиках прерываний
Я хотел бы знать, почему спин-блокировки используются вместо семафоров внутри обработчика прерывания.
3 ответов
семафоры заставляют задачи спать в споре, что неприемлемо для обработчиков прерываний. В принципе, для такой короткой и быстрой задачи (обработка прерываний) работа, выполняемая семафором, является излишней. Кроме того, spinlocks не может удерживаться более чем одной задачей.
проблема в том, что обработчики прерываний (IH) запускаются асинхронно и непредсказуемым образом, из области любых других действий, выполняемых в системе. На самом деле, IHs выходят за рамки концепции потоков и планирования вообще. Из-за этого все примитивы взаимного исключения, которые полагаются на планировщик, неприемлемы. Поскольку их использование в IH может значительно увеличить задержки обработки прерываний (в случае IH, запущенного в контексте потока с низким приоритетом) и способен производить взаимоблокировки (в случае IH, запущенного в контексте потока, который удерживает блокировку).
вы можете посмотреть хорошее и подробное описание spinlocks в http://www.makelinux.net/ldd3/chp-5-sect-5.
в чем проблема с семафором и мьютексом. И зачем нужен спинлок ?
- можем ли мы использовать
semaphore
илиmutex
на обработчики прерываний. Ответ да и нет. вы можете использовать игра, но вы не можете использовать вниз и блокировки, поскольку это блокирующие вызовы, которые ставят процесс вsleep
и мы не должны спать в обработчиках прерываний. -
обратите внимание, что семафор не методы systemV IPC, его просто методы синхронизации. И есть три функции для приобретения семафора.
вниз() : приобретите семафор и положите в не-прерываемое состояние.
down_trylock() : попробуйте, если блокировка доступна , если блокировка недоступна, не спите.
- up () : - свой полезный для выпускать семафор!--18-->
Итак, что, если мы хотим достичь синхронизации в обработчиках прерываний ? Использовать spinlocks.
что spinlocks будет делать ?
Spinlock-это замок, который никогда не поддается.
подобно мьютексу, он имеет две операции-блокировка и разблокировка.
если замок доступен, то процесс приобретет его и будет продолжайте в критическом разделе и разблокировать его, как только его сделали. Это похоже на
mutex
. Но,что делать, если блокировка недоступна ? вот, приходит интересное различие. Сmutex
процессsleep
, пока замок не будет доступен. Но,
в случае spinlock, он идет в плотную петлю, где он непрерывно проверяет наличие замка, пока он не станет доступен
.
- это вращающаяся часть спинового замка. Он был разработан для многопроцессорных систем. Но с упреждающим ядром даже однопроцессорная система ведет себя как SMP.