Межпроцессная синхронизация ресурса обычно реализуется посредством ассоциирования со структурой lock. В ядре есть менеджер блокировок, который управляет ими. Операции, предусмотренные менеджером блокировок, следующие.
Запрос разделения: получение одной из нескольких возможных разделяемых блокировок. Если поток, владеющий исключительной блокировкой, запрашивает разделяемую блокировку, его исключительная блокировка будет переведена на уровень разделяемой.
Запрос исключительности: прекращение дальнейшего разделения блокировок при их освобождении, предоставление ожидания повышения уровня (см. следующий пункт), если он существует, а затем предоставление исключительнойю блокировки. В одно и то же время может существовать лишь одна исключительная блокировка, за исключением случая, когда поток, владеющий исключительной блокировкой, может получить дополнительные исключительные блокировки, если он явным образом установил флаг canrecurse в запросе блокировки или если флаг canrecurse был установлен при инициализации блокировки.
Запрос повышения уровня: поток должен владеть разделяемой блокировкой, которую он хочет перевести на уровень исключительной блокировки. В промежутке времени между запросом повышения уровня и его предоставлением к ресурсу могут получить исключительный доступ другие потоки.
Запрос исключительного повышения уровня: поток должен владеть разделяемой блокировкой, уровень которой он хочет повысить до исключительной блокировки. Если запрос будет успешным, в промежутке времени между запросом повышения уровня и его предоставлением исключительный доступ к ресурсу другие потоки не получат. Однако, если другой поток уже запросил повышение уровня, запрос потерпит неудачу.
Запрос понижения уровня: поток должен владеть исключительной блокировкой, уровень которой он хочет понизить до разделяемой блокировки. Если поток владеет несколькими (рекурсивными) исключительными блокировками, уровень их всех будет снижен до разделяемых блокировок.
Запрос освобождения: освобождает один экземпляр блокировки.
Запрос утечки: подождать окончания деятельности с блокировкой до конца и пометить ее как списанную. Эта возможность используется до освобождения блокировки, являющейся участком памяти, которая вскоре будет освобождена.
Перед первым использованием блокировки должны быть инициализированы путем вызова функции lockinit(). Параметры функции lockinit() включают следующее.
Приоритет верхней половины ядра, с которым поток должен быть запущен после получения блокировки.
Флаги, такие, как canrecurse, дающие потоку, владеющему в настоящий момент блокировкой, возможность получить другую исключительную блокировку вместо паники с сообщением об ошибке «блокирование на себя».
Строка, описывающая ресурс, который блокировка защищает, которая называется сообщением канала ожидания.
Необязательное максимальное время ожидания доступности блокировки.
- 01/10/2010 01:49 - Планировщик 4.4BSD
- 28/09/2010 13:03 - Функции планировщика ULE
- 27/09/2010 22:41 - Планировщик ULE
- 22/09/2010 20:46 - Планирование потоков
- 20/09/2010 00:36 - Другие виды синхронизации
- 14/09/2010 12:02 - Синхронизация с помощью мьютекса
- 13/09/2010 12:25 - Синхронизация
- 11/09/2010 16:42 - Добровольное переключение контекста
- 08/09/2010 09:38 - Переключение контекста на низком уровне
- 01/09/2010 07:22 - Состояние потока