Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпора_ОС_модуль_2.docx
Скачиваний:
0
Добавлен:
10.12.2019
Размер:
56.8 Кб
Скачать
  1. Блокирующие переменные

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

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

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

  1. Семафоры

Обобщение для блокирующие переменных, в которых вместо двоичных, используются переменные, которые могут принимать целые, не отрицательные значения. Для работы с семафорами вводится два примитива P и V, переменная S представляет собой семафор. Тогда действие V(S) и P(S) будут определены следующим образом:

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

  2. P(S) уменьшение S на единицу, если это возможно. Если S = 0 и его невозможно уменьшить, оставаясь в области целых не отрицательных чисел, то в этом случае поток, вызывающий операцию P ждет пока уменьшение станет возможным. Успешная проверка и уменьшения является операциями не делимыми.

Рассмотрим классический пример использования семафора взаимодействия двух выполняющихся, в режиме мультипрограммирования, потоков, один из которых пишет данные, а другой их читает. Пусть буферный пункт состоит из N буферов, каждый из которых может содержать одну запись. В общем случае потоки читатели и писатели могут иметь разную скорость. Для правильной совместной работы, поток писатель должен останавливаться, когда все буферы заняты и активизироваться при освобождении хотя бы одного буфера. И наоборот, поток читатель должен приостанавливается, когда все буферы пусты и активизироваться, когда хоть 1 буфер занят.

Введем два семафора:

  1. e – число пустых буферов

  2. f – число заполненных буферов.

Поток писатель, прежде всего, выполняет операцию P(e) (уменьшаем значение). После этого происходит операция V(f) (увеличиваем кол-во записывающих потоков).

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

  1. Тупики

В зависимости от скорости потоков, они могут взаимно блокировать друг-друга, либо образовывать очереди к разделяемым ресурсам либо же совершенно независимо использовать разделяемые ресурсы.

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]