пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Семафоры и семафорные примитивы. Их использование для решения проблемы критической секции.

В общем о семафорах!
Операция P  заключается в проверке значения семафора и, если оно положительное, уменьшении значения на 1. Если значение семафора равно 0, то выполнение процесса, затребовавшего эту операцию, приостанавливается. Операция V увеличивает значение семафора на 1, если это возможно. В том случае, когда значение семафора соответствует предельному верхнему значению, операция  V игнорируется.
Существенно, что проверка значения семафора, изменение его значения и блокировка процесса выполняются как одно неделимое действие. Поэтому операции над семафорами часто 
называют семафорными примитивами. 
Еще одним важным свойством операций над семафорами является предположение о том, что одновременное обращение к одному семафору двух и более процессов рассматривается как последовательное обращение в произвольном порядке.
Перед использованием семафора его необходимо инициализировать. Как правило при инициализации защищенной переменной присваивается значение, показывающие, что ни один поток не находится внутри критического участка.
Формализованное описание операций P и V
Пусть S – семафор, N – максимальное допустимое значение семафора. Тогда P(S) и V(S) определяются следующим образом.
P(S) : [Если S > 0; S = S – 1; блокировка процесса]
V(S) : [Если S<N; S=S+1; ]
Критические секции: взаимное исключение. 


Под критической секцией процесса понимают набор команд, которые обрабатывают общую для нескольких процессов область памяти.
Постановка задачи: 
Пусть есть два процесса Р1 и Р2 (рис. 1), каждый из которых является циклическим. Процессы 
обладают равными приоритетами. Скорости развития процессов  не известны. Процессы взаимодействуют через общую область памяти. Необходимо так запрограммировать работу процессов, 
чтобы в текущий момент времени в критической секции находился только один из них.


Рассмотри несколько ситуаций, для того чтобы убедиться в правильности предложенного решения .
Предположим, что процесс Р1, выполнив часть своего кода «программа 11», достиг примитива  P(S). 
Так как начальное значение семафора S равно 1, то процесс P1 благополучно войдет в свою критическую секцию CS1, параллельно уменьшив значение семафора S до 0. Если теперь процесс Р2 попытается выполнить примитив P(S), желая войти в критическую секцию CS2, то он будет заблокирован на этом примитиве из-за нулевого значения семафора. Дальнейшее развитие процесса Р2 будет возможно только после того, как  процесс Р1 покинет свою критическую секцию и, выполнив примитив V(S), увеличит значение семафора на 1.
Теперь предположим, что процесс Р1 либо очень долго выполняет часть своего кода «программа 12» либо по какой-то причине просто остановился в этой части кода. В этом случае никаких ограничений на развитие процесса Р2 накладываться не будет, так как процесс Р1 не будет влиять на значение семафора S. Следовательно, устранена блокировка вида а.
Предположим, что при выполнении программы два процесса одновременно подошли к примитивам P(S). В этом случае необходимо вспомнить, что «одновременное обращение двух и более процессов к семафору рассматривается как последовательное обращение в случайном порядке».  Таким образом, получаем два варианта развития событий. В первом случае сначала примитив P(S) выполнит процесс 
Р1, а затем последует попытка выполнить примитив Р(S) процессом Р2. Во втором случае процессы поменяются местами. Важно, что в обоих вариантах доступ к своим критическим секциям процессы будут иметь не одновременно.


15.06.2014; 14:33
хиты: 814
рейтинг:+1
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь