Книга: Разработка ядра Linux
Условные переменные
Условные переменные
Условные переменные (conditional variable, completion variable) — простое средство синхронизации между двумя заданиями, которые работают в режиме ядра, когда необходимо, чтобы одно задание послало сигнал другому о том, что произошло некоторое событие. При этом одно задание ожидает на условной переменной, пока другое задание не выполнит некоторую работу. Когда другое задание завершит выполнение своей работы, оно использует условную переменную для того, чтобы возвратить к выполнению все ожидающие на ней задания. Если это кажется похожим на работу семафора, то именно так оно и есть, идея та же. В действительности, условные переменные просто обеспечивают простое решение проблемы, для которой в других ситуациях используются семафоры. Например, в системном вызове vfork()
условная переменная используется для возврата к выполнению родительского процесса при завершении порожденного.
Условные переменные представляются с помощью структуры struct completion
, которая определена в файле <linux/completion.h>
.
Статически условная переменная может быть создана с помощью макроса
DECLARE_COMPLETION(mr_comp);
Динамически созданная условная переменная может быть инициализирована с помощью функции init_completion()
.
Задание, которое должно ожидать на условной переменной, вызывает функцию wait_for_completion()
. После того как наступило ожидаемое событие, вызов функции complete()
посылает сигнал заданию, которое ожидает на условной переменной, и это задание возвращается к выполнению. В табл. 9.7 приведены методы работы с условными переменными.
Таблица. 9.7. Методы работы с условными переменными
Метод | Описание |
---|---|
init_completion(struct completion*) |
Инициализация динамически созданной условной переменной в заданной области памяти |
wait_for_completion(struct completion*) |
Ожидание сигнала на указанной условной переменной |
complete(struct completion*) |
Отправка сигнала всем ожидающим заданиям и возвращение их к выполнению |
Для примеров использования условных переменных смотрите файлы kernel/sched.c
и kernel/fork.с
. Наиболее часто используются условные переменные, которые создаются динамически, как часть структур данных. Код ядра, который ожидает на инициализацию структуры данных, вызывает функцию wait_for_completion()
. Когда инициализация закончена, ожидающие задания возвращаются к выполнению с помощью вызова функции complete()
.
- Атомарные операции
- Спин-блокировки
- Спин-блокировки чтения-записи
- Семафоры
- Семафоры чтения-записи
- Сравнение спин-блокировок и семафоров
- Условные переменные
- BKL: Большая блокировка ядра
- Секвентные блокировки
- Средства запрещения преемптивности
- Барьеры и порядок выполнения
- Резюмирование по синхронизации
- 13.2.4. Условные переменные
- Условные выражения
- Условные операторы
- ГЛАВА 7 Взаимные исключения и условные переменные
- Условные блоки
- 4.4.6. Сигнальные (условные) переменные
- 7.5. Условные переменные: ожидание и сигнализация
- 7.6. Условные переменные: время ожидания и широковещательная передача
- 26.8. Условные переменные