Строгое чередование
Сравнительный анализ С, C++, Java и четырех других языков программирования представлен в [97].
Листинг 2.1. Предлагаемое решение проблемы критической секции (для обоих процессов необходимо удостовериться в наличии точки с запятой после цикла while)
/* Процесс 1 */ while(TRUE) {
while(turn!=0) /* ожидание */;
critical_region();
turn=l;
noncritical_region();
}
/* Процесс 2 */ while(TRUE) {
while(turnI=1) /* ожидание */;
critical_region(); turn=0;
noncritical_region();
}
В листинге 2.1 целая переменная turn, изначально равная 0, фиксирует, чья очередь входить в критическую секцию.
Вначале процесс 0 проверяет значение turn, считывает 0 и входит в критическую секцию. Процесс 1 также проверяет значение turn, считывает 0 и после этого в цикле непрерывно проверяет, когда же значение turn будет равно 1. Постоянная проверка значения переменной в ожидании некоторого значения называется активным ожиданием. Однако подобного подхода следует избегать, поскольку он является причиной бесцельного расходования ресурсов процессора. Активное ожидание может быть приемлемым только в случае, когда есть уверенность в коротком времени ожидания.Когда процесс 0 покидает критическую секцию, он изменяет значение turn на 1, позволяя процессу 1 завершить цикл. Предположим, что процесс 1 быстро покидает свою критическую секцию, так что оба процесса находятся в обычном состоянии, и значение turn равно 0. После этого процесс 0 быстро выполняет весь цикл, выходит из критической секции и устанавливает значение turn равным 1. В итоге в этот момент значение turn оказывается равным 1, и оба процесса находятся вне критической секции.
Неожиданно процесс 0 завершает работу вне критической секции и возвращается к началу цикла. Но на большее он не способен, поскольку значение turn равно 1, и процесс 1 находится вне критической секции. Процесс 0 «зависает» в своем цикле while, ожидая, пока процесс 1 изменит значение turn на 0. Получается, что метод поочередного доступа к критической секции не слишком удачен, если один процесс существенно медленнее другого.
Эта ситуация нарушает третье из сформулированных нами условий: один процесс блокируется другим, не находящимся в критической секции. Возвратимся к примеру с каталогом спулера: если заменить критическую секцию процедурой считывания из каталога и записи в каталог, процесс 0 не сможет послать файл на печать, поскольку процесс 1 занят чем-то другим.
Фактически этот метод требует, чтобы два процесса попадали в критические секции строго по очереди. Ни один из них не сможет войти в критическую секцию (например, послать файл на печать) два раза подряд. Хотя этот алгоритм и исключает условия гонок, его нельзя рассматривать всерьез, поскольку он нарушает третье правило успешной работы двух параллельных процессов с общими данными.
Еще по теме Строгое чередование:
- Влияние чередования аспектов
- ИЗОЛЯЦИЯ СТРОГАЯ
- Хаос вопросов со строгой логикой построения
- 3. Исправительная колония строгого режима
- Сатурн, Строгий Учитель
- 4. Не разграничивайте строго жизнь своей семьи и свои
- § 3 Сущность и идея брака. – Нравственное его значение. – Таин- ство в браке. – Историческое развитие идеи брака. – Много- женство, многомужие и одноженство. – Идея, семейное, обще- ственное и религиозное значение брака в Древнем мире. – Религиозный обряд брака у древних. – Строгая форма брака. – Освящение брака в христианстве. – Церковное понятие о браке на Западе и Востоке. – Секуляризация брака и подчинение его гражданскому закону и суду после реформации и революции. – Брачный закон и суд в Р
- АКЦЕНТУАЦИЯ ЦИКЛОИДНАЯ
- ХАРАКТЕР ЦИКЛОИДНЫЙ
- РИТМ
- Второй этап
- АКТИВНОСТЬ ПСИХИЧЕСКАЯ: БИОРИТМ
- САДОМАЗОХИЗМ
- ВКУС