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

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

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


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

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

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

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

Спасибо


person Kroma    schedule 12.03.2015    source источник
comment
Спин-блокировки помогают при наличии нескольких процессоров. Как несколько процессоров поместятся в эту конкретную очередь и решение без блокировок?   -  person srd    schedule 12.03.2015
comment
Им бы просто атомарно увеличить счётчик заборами и поменять местами один указатель. Хм   -  person Kroma    schedule 12.03.2015
comment
Не уверен, что вы спрашиваете. Спин-блокировки в первую очередь предназначены для использования (или взаимодействия) в контекстах, которые не могут блокировать/перепланировать. Их следует использовать только там, где вероятность их фактического ожидания относительно низка. Пример: предположим, что обработчик прерывания (а также другие контексты) создал структуру данных и должен связать ее в двусвязный список. Это займет всего наносекунды, и вероятность столкновения с другим процессом низка, но это должно иметь атомарный эффект: ни один другой процессор/поток не должен видеть список в промежуточном (частично связанном) состоянии.   -  person Gil Hamilton    schedule 12.03.2015
comment
Понятно. Ты дал мне понять.   -  person Kroma    schedule 13.03.2015
comment
@GilHamilton, почему бы тебе не сделать это ответом (который можно принять)?   -  person Alex D    schedule 13.03.2015
comment
Точный. Я, конечно, приму это.   -  person Kroma    schedule 13.03.2015


Ответы (1)


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

person Gil Hamilton    schedule 13.03.2015
comment
Спасибо Гил за объяснение :) - person Kroma; 13.03.2015