Шрифт:
Для семафоров есть реализации функций
Семафоры чтения-записи имеют уникальную функцию, аналога которой нет для спин-блокировок чтения-записи. Это функция
Семафоры чтения-записи, так же как и спин-блокировки аналогичного типа, должны использоваться, только если есть четкое разделение между участками кода, которые осуществляют чтение, и участками кода, которые осуществляют запись. Использование механизмов блокировок чтения-записи приводит к дополнительным затратам, поэтому их стоит использовать, только если код можно четко разделить на участки чтения и записи.
Сравнение спин-блокировок и семафоров
Понимание того, когда использовать спин-блокировки, а когда семафоры является важным для написания оптимального кода. Однако во многих случаях выбирать очень просто. В контексте прерывания могут использоваться только спин-блокировки, и только семафор может удерживаться процессом, который находится в состоянии ожидания. В табл. 9.6 показан обзор требований того, какой тип блокировок использовать.
Таблица 9.6. Что следует использовать: семафоры или спин-блокировки
Требование | Рекомендуемый тип блокировки |
---|---|
Блокировка с малыми накладными затратами (low overhead) | Спин-блокировки более предпочтительны |
Малое время удержания блокировки | Спин-блокировки более предпочтительны |
Длительное время удержания блокировки | Семафоры более предпочтительны |
Необходимо использовать блокировку в контексте прерывания | Необходима спин-блокировка |
Необходимо переходить в состояние ожидания (steep) при захваченной блокировке | Необходимо использовать семафоры |
Условные переменные
Условные переменные (conditional variable, completion variable) — простое средство синхронизации между двумя заданиями, которые работают в режиме ядра, когда необходимо, чтобы одно задание послало сигнал другому о том, что произошло некоторое событие. При этом одно задание ожидает на условной переменной, пока другое задание не выполнит некоторую работу. Когда другое задание завершит выполнение своей работы, оно использует условную переменную для того, чтобы возвратить к выполнению все ожидающие на ней задания. Если это кажется похожим на работу семафора, то именно так оно и есть, идея та же. В действительности, условные переменные просто обеспечивают простое решение проблемы, для которой в других ситуациях используются семафоры. Например, в системном вызове
Условные переменные представляются с помощью структуры
Статически условная переменная может быть создана с помощью макроса
Динамически созданная условная переменная может быть инициализирована с помощью функции
Задание, которое должно ожидать на условной переменной, вызывает функцию
Таблица. 9.7. Методы работы с условными переменными
Метод | Описание |
---|---|
init_completion(struct completion*) | Инициализация динамически созданной условной переменной в заданной области памяти |
wait_for_completion(struct completion*) | Ожидание сигнала на указанной условной переменной |
complete(struct completion*) | Отправка сигнала всем ожидающим заданиям и возвращение их к выполнению |