Операционные системы. Курс лекций




Реализация операций семафора - часть 3


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

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

3)    Реализация семафоров на пользовательском уровне. Пользовательский поток, которому требуется доступ к общему ресурсу или синхронизация с другим пользовательским потоком, может вызвать методы SimWait() и SimSignal() класса семафора, реализованного в исполнительной системе.

Если в значении семафора указано, что общий ресурс свободен, пользовательский поток, который вызвал метод SimWait() может продолжить работу. В данном случае блокировка его вызова не выполняется. Если же ресурс занят, необходимо уведомить механизм обработки прерываний о том, что поток ждет освобождения этого ресурса, заблокировать данный поток и направить другой поток на выполнение. Блокирование и планирование производится исполнительной системой на пользовательском уровне и ОС в этом не участвует.

Единственный видимый ОС прикладной процесс остается в состоянии выполнения все время, пока происходит переключение от пользовательского потока к обработчику прерываний, затем к модулю управления процессами, и снова пользовательскому потоку.

Возможен другой вариант. Чтобы блокировать пользовательский поток, должен быть заблокирован соответствующий поток ядра, для чего вызывается ОС. Когда пользовательский поток выполняет вызов SimSignal() при отсутствии ожидающих потоков, значение семафора увеличивается на 1 и обращение к модулю управления процессами не происходит.Если же несколько процессов уже ждут у семафора, один из них удаляется из очереди и выполняется вызов для разблокирования семафора. Этот вызов может направляться модулю управления процессами пользовательского уровня или ОС. В обоих случаях сигнализирующий поток переводится из состояния блокирования в состояние готовности.




Содержание  Назад  Вперед