c - ядро ​​- спин-блокировки против очередей

Я думаю, что, несмотря на всю доступную документацию, я не понимаю, почему нужно ждать спин-блокировки в контексте ядра.

Почему нет определенной очереди с процессом, требующим блокировки с атомарным счетчиком / индексом, и, если preempt отключен, обрабатывать их, как они появляются в этом списке, а когда счетчик в этом списке становится равным 0, вернуться к основному расписанию. список?


Две ситуации:

  • система недогружена, возможно, спин-блокировка быстрее (зависит от одновременности блокировки в данный момент);

  • Система сильно загружена, возможно, эта стратегия быстрее (больше не нужно ждать).

Я могу пропустить что-то очень умное здесь, и я хотел бы понять это, пожалуйста.

Спасибо

1 ответ

Решение

Спин-блокировки в основном предназначены для использования (или для взаимодействия) с контекстами, которые не могут блокировать / перепланировать. Их следует использовать только в том случае, если вероятность их фактического ожидания относительно мала и замок не будет долго удерживаться. Например, предположим, что обработчик прерываний (и / или других контекстов) создал структуру данных и должен связать ее в двусвязный список. Это займет всего лишь наносекунды для завершения, и вероятность столкновения с другим процессом низка, но он должен иметь атомарный эффект: никакой другой процессор / поток не должен видеть список в промежуточном (частично связанном) состоянии.

Другие вопросы по тегам