Разница между переменными завершения и семафорами - PullRequest
7 голосов
/ 22 января 2011

В ядре Linux семафоры используются для взаимного исключения критических участков данных, а переменные завершения используются для синхронизации двух потоков, ожидающих события.Почему бы не использовать семафоры для такой синхронизации?Есть ли преимущество использования переменной завершения над семафором?

Ответы [ 2 ]

12 голосов
/ 22 января 2011

Объяснение того, почему дополнения были первоначально реализованы: http://lkml.indiana.edu/hypermail/linux/kernel/0107.3/0674.html

Основная сводка заключается в том, что у нас было это (довольно распространенный) способ ожидания определенные события, имея запертый семафор на стеке официанта, а затем официант делает "down ()", который вызвал его блокировку пока вещь, которую он ждал, не сделала "вверх ()".

Это работает довольно хорошо, , но это имеет действительно маленькая (и довольно маловероятная) гонка на SMP, это не столько гонка сама идея, по состоянию на реализация семафоров. Мы мог бы исправить семафоры, но было несколько причин не делать этого:

  • Семафоры оптимизированы (специально) для неконфликтного случая. Использование «ждать завершения» имеет обратный случай по умолчанию
  • семафоры довольно сложны и специфичны для конкретной архитектуры, точно
    благодаря этой оптимизации. Пытаясь изменить их больно, как ад.

Итак, вместо этого я ввел понятие "дождаться завершения":

Более свежая ветка о доработках и семафорах http://lkml.org/lkml/2008/4/11/323

9 голосов
/ 22 января 2011

Есть две причины, по которым вы можете использовать завершение вместо семафора. Во-первых, несколько потоков могут ожидать завершения, и все они могут быть освобождены одним вызовом complete_all(). Сложнее заставить семафор разбудить неизвестное количество потоков.

Во-вторых, если ожидающий поток собирается освободить объект синхронизации, при использовании семафоров возникает условие гонки. То есть официант может проснуться и освободить объект до того, как завершится бодрствующий поток с up(). Эта раса не существует для доработок. (См. Сообщение Лассе.)

...