Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
рализ сем мех в 32 разр сист.docx
Скачиваний:
10
Добавлен:
11.02.2015
Размер:
573.34 Кб
Скачать

Взаимное исключение на семафоре

Для реализации взаимного исключения, например, предотвращения возможности одновременного изменения двумя или более процессами общих данных, создается двоичный (с возможными значениями 0 и 1) семафор S. Начальное значение этого семафора - 1. Критические секции кода (секции, которые могут одновременно выполняться только одним процессом) обрамляются "скобками" P(S) (в начале секции) и V(S) (в конце секции). Процесс, входящий в критическую секцию, выполняет операцию P(S) и переводит семафор в 0. Если в критической секции уже находится другой процесс, то значение семафора уже 0, тогда второй процесс, желающий войти в критическую секцию, блокируется в своей P-операции до тех пор, пока процесс, находящийся в критической секции сейчас, не выйдет из нее, выполнив на выходе операцию V(S).    

Синхронизация на семафоре

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

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

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

Идея семафора в соответствии с названием взята из метода синхронизации движения поез­дов, принятого на железной дороге. Железнодорожный семафор – это "сигнальный флажок", показывающий, свободен путь впереди или занят другим поездом. По мере движения поезда семафоры устанавливаются и сбрасываются. Семафор остается установленным на время, доста­точное, чтобы при необходимости остановить другой поезд. Таким образом, железнодорожные семафоры можно рассматривать как устройства, которые сигнализируют об условиях, чтобы обеспечить взаимоисключающее прохождение поездов по критическим участкам пути. Семафо­ры в параллельных программах аналогичны – они предоставляют базовый механизм сигнали­зации и используются для реализации взаимного исключения и условной синхронизации.

Синтаксис и семантика

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

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

Семафор объявляется так: sem s ;

По умолчанию начальным значением является 0, но семафор можно инициализировать лю­бым положительным значением, например:

sem lock =  1; Массивы семафоров можно объявлять и при необходимости инициализировать обычным образом:

sem  forks[5]   =   ([5]   1);

Если бы в этой декларации не было инициализации, то начальным значением каждого сема­фора в массиве forks был 0.

После объявления и инициализации семафор можно обрабатывать только с помощью операций р и V. Каждая из них является неделимым действием с одним аргументом. Пусть s – семафор. Тогда операции P (s) и V (s) определяются следующим образом.

P(s):   < await   (s>0) s=s-l; >

V(s) :   < s   =   s   +   1; >

Операция V увеличивает значение s на единицу неделимым образом. Операция Р уменьшает значение s, но, чтобы после вычитания значение s не стало отрицательным, она сначала ожидает, пока s не станет положительным.

Приостановка выполнения и вычитание в операции р являются единым неделимым действием. Предположим, что s – семафор с текущим значением 1. Если два процесса пытаются одновременно выполнить операцию Р (s), то это удастся сделать только одному из них. Но если один процесс пытается выполнить операцию Р (s), а другой – V (s), то обе операции будут ус­пешно выполнены в непредсказуемом порядке, а конечным значением семафора s станет 1.

Обычный семафор может принимать любые неотрицательные значения, двоичный семафор – только значения 1 или 0. Это значит, что операция V для двоичного семафора может быть вы­полнена, только когда его значение 0. (Операцию V для двоичного семафора можно опреде­лить как ожидание, пока значение семафора станет меньше 1, и затем его увеличение на 1.)

Поскольку операции с семафором определяются в терминах операторов  await, их фор­мальная семантика следует непосредственно из применения правила оператора  await. Правила вывода для операций Р и V получаются непосредственно из правила опе­ратора await, примененного к конкретным операторам в определении Р и V.

Свойства справедливости для операций с семафорами тоже следуют из их определения с по­мощью оператора await.  Если условие s > 0 стано­вится и далее остается истинным, выполнение операции Р (s) завершится при справедливой в слабом смысле стратегии планирования. Если условие s > 0 становится истинным бесконеч­но часто, то выполнение операции Р (s) завершится при справедливой в сильном смысле стра­тегии планирования. Операция V для обычного семафора является безусловным неделимым действием, поэтому она завершится, если стратегия планирования безусловно справедлива.

При реализации семафоров обычно обеспечивается, что, ес­ли процессы приостанавливаются, выполняя операции р, они возобновляются в том же порядке, в котором были приостановлены. Следовательно, процесс, ожидающий выполнения операции Р, сможет в конце концов продолжить работу, если другие процессы выполнят со­ответствующее число операций V.