Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
госы / Lektsii_OS_new_new.doc
Скачиваний:
66
Добавлен:
10.04.2015
Размер:
3.62 Mб
Скачать
    1. Синхронизация методом взаимных исключений

Существует два типа реализующих синхронизацию процесса:

  1. взаимное исключение

  2. условная синхронизация.

Во взаимном исключении организуется исключающий доступ к общим ресурсам (переменным) единственного потока или процесса.

В условной синхронизации не допускается исполнение треб. операции или программы пока не будет достигнуто условие треб. программы.

Рассмотрим методы синхронизации взаимного исключения:

    1. Метод блокирующей переменной

Используется программистом, реализ. в пользовательском пространстве, т.е. без обращения к ядру. Каждому набору критических секций ставится в соответствие глобальной двоичной переменной, которой присваивается значение единицы, когда вн. в идентичные секции и ноль, когда вых.

«1» - занят

«0» - освободится.

Запрос к некоторому ресурсу Dможно представить следующим алгоритмом:

F(D) – блокирующая переменная, отвечающая за занятость процесса.

Листинг 2.2. Вход и выход из критической области с помощью команды TSL enter_region;

TSL REGISTER.LOCK | Значение lock копируется в регистр, значение переменной

Устанавливается равным 1 GMP REGISTER.#0 I Старое значение lock сравнивается с нулем

JNE enter_region I Если оно ненулевое, значит, блокировка уже была установлена,

поэтому цикл завершается RET I Возврат к вызывающей программе, процесс вошел в критическую

область

leave_region;

MOVE LOCK .#0 | Сохранение 0 в переменной lock

RET

Недостаток: запущенный процесс неопределенно долго может находится в петле ожидания, при этом тратится время.

Такой способ синхронизации быстродейств, т.к. происходит в пространстве пользователя, а не ядра, треб. – контекст сохранения.

Однако, возможен вход нескольких процессов в критическую секцию.

Например, пусть некоторый поток, который требует доступы к некоторым ресурсам. Не успев его установить в состояние «занят» он был прерван, например по истечении кванта.

Другой процесс определяет, что ресурс свободен, занял ресурс, вошел в критическую секцию и был прерван.

Когда первый процесс получит управление он считает, что ресурс свободен, занимает его, и так же входит в критическую секцию. Таким образом, два процесса оказываются в критической секции, что не допустимо.

Чтобы исключить такую ситуацию, можно применить следующие приемы:

      1. при запросе ресурса запрещать прерывания, однако, такой метод не годится для многопроцессных систем, т.к. запрещается прерывание в том процессе, в котором запрещ. поток, остальные процессоры – активны.

      2. использовать неделимую (единую) команду, которая определяет свободен или занят ресурс и устанавливает: занять или освободить TSL.BTRr/mнаходится либо в регистре, либо в памяти (сбросить, освободить). .BTSr/mпроверить и установить блокирующую переменную.

    1. Блокирующей переменной с использованием системного вызова

Метод системных вызовов заключается в том, что процесс или поток прежде чем войти в критическую секцию выполняет системный вызов.

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

Тогда алгоритм будет следующим:

Такой метод исключает бесконечный цикл опроса блокирующих переменных.

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

Блокирующие переменные, использующие системные вызовы, называют мьютексами, этот метод поддерживается почти всеми ОС.

Соседние файлы в папке госы