c - ядро - спин-блокировки против очередей
Я думаю, что, несмотря на всю доступную документацию, я не понимаю, почему нужно ждать спин-блокировки в контексте ядра.
Почему нет определенной очереди с процессом, требующим блокировки с атомарным счетчиком / индексом, и, если preempt отключен, обрабатывать их, как они появляются в этом списке, а когда счетчик в этом списке становится равным 0, вернуться к основному расписанию. список?
Две ситуации:
система недогружена, возможно, спин-блокировка быстрее (зависит от одновременности блокировки в данный момент);
Система сильно загружена, возможно, эта стратегия быстрее (больше не нужно ждать).
Я могу пропустить что-то очень умное здесь, и я хотел бы понять это, пожалуйста.
Спасибо
1 ответ
Спин-блокировки в основном предназначены для использования (или для взаимодействия) с контекстами, которые не могут блокировать / перепланировать. Их следует использовать только в том случае, если вероятность их фактического ожидания относительно мала и замок не будет долго удерживаться. Например, предположим, что обработчик прерываний (и / или других контекстов) создал структуру данных и должен связать ее в двусвязный список. Это займет всего лишь наносекунды для завершения, и вероятность столкновения с другим процессом низка, но он должен иметь атомарный эффект: никакой другой процессор / поток не должен видеть список в промежуточном (частично связанном) состоянии.