Помимо общих блокировок менеджера блокировок и мьютексов имеются три других вида доступных блокировок для использования в ядре. Эти другие типы используются не так интенсивно, но они включены здесь для полноты.
Разделяемые/исключительные блокировки используются для защиты данных, которые читаются гораздо чаще, чем записываются. Мьютексы в своей основе более эффективны, чем разделяемые/исключительные блокировки. Однако разделяемые/ исключительные блокировки быстрее, чем блокировки менеджера блокировок, поскольку у них отсутствуют многие из особенностей блокировок менеджера блокировок, такие, как возможности повышения или понижения уровня.
Для ожидания возникновения условий с мьютексами используются условные переменные. Потоки ожидают с указанием условных переменных, вызвав cv_wait(), cv_wait_sig() (ожидание до прерывания сигналом), cv_timedwait() (ожидание в пределах указанного максимального количества времени) или cv_timedwait_sig() (ожидание до прерывания сигналом или в пределах максимального указанного времени). Потоки разблокируют ожидающих, вызывая cv_signal() для разблокирования одного ожидающего или cvbroadcast() для разблокирования всех ожидающих. Функция cv_wait()_remove(J удаляет ожидающий поток из очереди ожидания условной переменной, если он в ней находится.
До вызова cvwait(), cv_wait_sig(), cv_timedwait() или cvjimedwait_sig() поток должен владеть мьютексом. Когда поток ожидает с указанным условием, мьютекс атомарно освобождается, прежде чем поток будет заблокирован, а затем атомарно получается снова, прежде чем функция вернется из вызова. Все ожидающие должны использовать с условной переменной один и тот же мьютекс. Поток должен владеть мьютексом, вызывая cvsignal() или cv_broadcast().
Счетные семафоры предоставляют механизм для синхронизации доступа к пулу ресурсов. В отличие от мьютексов семафоры не содержат представления о владельце, поэтому они могут также быть полезны в ситуациях, когда одному потоку нужно получить ресурс, а другому освободить его. У каждого семафора есть связанное с ним целое число. Регистрация (увеличение) всегда завершается успешно, но ожидание (уменьшение) может успешно завершиться, лишь если результирующее значение семафора больше или равно нулю. Семафоры не используются, когда мьютексов и условных переменных достаточно. Семафоры являются более сложным механизмом синхронизации, чем мьютексы и условные переменные, и не так эффективны.
- 03/10/2010 00:33 - Создание процесса
- 01/10/2010 01:49 - Планировщик 4.4BSD
- 28/09/2010 13:03 - Функции планировщика ULE
- 27/09/2010 22:41 - Планировщик ULE
- 22/09/2010 20:46 - Планирование потоков
- 16/09/2010 17:09 - Блокировки менеджера блокировок
- 14/09/2010 12:02 - Синхронизация с помощью мьютекса
- 13/09/2010 12:25 - Синхронизация
- 11/09/2010 16:42 - Добровольное переключение контекста
- 08/09/2010 09:38 - Переключение контекста на низком уровне