Важным понятием при изучении способов синхронизации процессов является понятие критической секции (critical section) программы. Критическая секция – это часть программы, исполнение которой может привести к возникновению race condition для определенного набора программ. Чтобы исключить эффект гонок по отношению к некоторому ресурсу, необходимо организовать работу так, чтобы в каждый момент времени только один процесс мог находиться в своей критической секции, связанной с этим ресурсом. Иными словами, необходимо обеспечить реализацию взаимоисключения для критических секций программ. Реализация взаимоисключения для критических секций программ с практической точки зрения означает, что по отношению к другим процессам, участвующим во взаимодействии, критическая секция начинает выполняться как атомарная операция. Давайте рассмотрим следующий пример, в котором псевдопараллельные взаимодействующие процессы представлены действиями различных студентов (таблица 5.1):
Здесь критический участок для каждого процесса – от операции «Обнаруживает, что хлеба нет» до операции «Возвращается в комнату» включительно. В результате отсутствия взаимоисключения мы из ситуации «Нет хлеба» попадаем в ситуацию «Слишком много хлеба». Если бы этот критический участок выполнялся как атомарная операция – «Достает два батона хлеба», то проблема образования излишков была бы снята.
Лучшие Научные Практики Современного Просветленного! Как Научиться Взламывать Законы Мира l НИКОШО
Время | Студент 1 | Студент 2 | Студент 3 |
17-05 | Приходит в комнату | ||
17-07 | Обнаруживает,что хлеба нет | ||
17-09 | Уходит в магазин | ||
17-11 | Приходит в комнату | ||
17-13 | Обнаруживает,что хлеба нет | ||
17-15 | Уходит в магазин | ||
17-17 | Приходит в комнату | ||
17-19 | Обнаруживает,что хлеба нет | ||
17-21 | Уходит в магазин | ||
17-23 | Приходит в магазин | ||
17-25 | Покупает 2 батона на всех | ||
17-27 | Уходит из магазина | ||
17-29 | Приходит в магазин | ||
17-31 | Покупает 2 батона на всех | ||
17-33 | Уходит из магазина | ||
17-35 | Приходит в магазин | ||
17-37 | Покупает 2 батона на всех | ||
17-39 | Уходит из магазина | ||
17-41 | Возвращается в комнату | ||
17-43 | |||
17-45 | |||
17-47 | Возвращается в комнату | ||
17-49 | |||
17-51 | |||
17-53 | Возвращается в комнату |
Сделать процесс добывания хлеба атомарной операцией можно было бы следующим образом: перед началом этого процесса закрыть дверь изнутри на засов и уходить добывать хлеб через окно, а по окончании процесса вернуться в комнату через окно и отодвинуть засов. Тогда пока один студент добывает хлеб, все остальные находятся в состоянии ожидания под дверью (таблица 5.2).
У вас беспокойство или тревога? Запомните эти 4 вещи
Время | Студент 1 | Студент 2 | Студент 3 |
17-05 | Приходит в комнату | ||
17-07 | Достаёт два батона хлеба | ||
17-43 | Приходит в комнату | ||
17-47 | Приходит в комнату |
Итак, для решения задачи необходимо, чтобы в том случае, когда процесс находится в своем критическом участке, другие процессы не могли войти в свои критические участки. Мы видим, что критический участок должен сопровождаться прологом (entry section) – «закрыть дверь изнутри на засов» – и эпилогом (exit section) – «отодвинуть засов», которые не имеют отношения к активности одиночного процесса. Во время выполнения пролога процесс должен, в частности, получить разрешение на вход в критический участок, а во время выполнения эпилога – сообщить другим процессам, что он покинул критическую секцию.
В общем случае структура процесса, участвующего во взаимодействии, может быть представлена следующим образом:
while (some condition)
Источник: mydocx.ru
Лекция: Критическая секция
Важным понятием при изучении способов синхронизации процессов является понятие критической секции (critical section) программы. Критическая секция – это часть программы, исполнение которой может привести к возникновению race condition для определенного набора программ. Чтобы исключить эффект гонок по отношению к некоторому ресурсу, необходимо организовать работу так, чтобы в каждый момент времени только один процесс мог находиться в своей критической секции, связанной с этим ресурсом. Иными словами, необходимо обеспечить реализацию взаимоисключения для критических секций программ. Реализация взаимоисключения для критических секций программ с практической точки зрения означает, что по отношению к другим процессам, участвующим во взаимодействии, критическая секция начинает выполняться как атомарная операция. Давайте рассмотрим следующий пример, в котором псевдопараллельные взаимодействующие процессы представлены действиями различных студентов (таблица 5.1):
Здесь критический участок для каждого процесса – от операции «Обнаруживает, что хлеба нет» до операции «Возвращается в комнату» включительно. В результате отсутствия взаимоисключения мы из ситуации «Нет хлеба» попадаем в ситуацию «Слишком много хлеба». Если бы этот критический участок выполнялся как атомарная операция – «Достает два батона хлеба», то проблема образования излишков была бы снята.
Таблица 5.1. | |||
Время | Студент 1 | Студент 2 | Студент 3 |
17-05 | Приходит в комнату | ||
17-07 | Обнаруживает, что хлеба нет | ||
17-09 | Уходит в магазин | ||
17-11 | Приходит в комнату | ||
17-13 | Обнаруживает, что хлеба нет | ||
17-15 | Уходит в магазин | ||
17-17 | Приходит в комнату | ||
17-19 | Обнаруживает, что хлеба нет | ||
17-21 | Уходит в магазин | ||
17-23 | Приходит в магазин | ||
17-25 | Покупает 2 батона на всех | ||
17-27 | Уходит из магазина | ||
17-29 | Приходит в магазин | ||
17-31 | Покупает 2 батона на всех | ||
17-33 | Уходит из магазина | ||
17-35 | Приходит в магазин | ||
17-37 | Покупает 2 батона на всех | ||
17-39 | Уходит из магазина | ||
17-41 | Возвращается в комнату | ||
17-43 | |||
17-45 | |||
17-47 | Возвращается в комнату | ||
17-49 | |||
17-51 | |||
17-53 | Возвращается в комнату |
· Сделать процесс добывания хлеба атомарной операцией можно было бы следующим образом: перед началом этого процесса закрыть дверь изнутри на засов и уходить добывать хлеб через окно, а по окончании процесса вернуться в комнату через окно и отодвинуть засов. Тогда пока один студент добывает хлеб, все остальные находятся в состоянии ожидания под дверью (таблица 5.2).
Таблица 5.2. | |||
Время | Студент 1 | Студент 2 | Студент 3 |
17-05 | Приходит в комнату | ||
17-07 | Достает два батона хлеба | ||
17-43 | Приходит в комнату | ||
17-47 | Приходит в комнату |
· Итак, для решения задачи необходимо, чтобы в том случае, когда процесс находится в своем критическом участке, другие процессы не могли войти в свои критические участки.
Источник: ronl.org
Ситуация состязаний (гонки). Способы предотвращения.
Состязания – ситуация, когда два или более потоков обрабатывают разделяемые данные и конечный результат зависит от соотношения скоростей потоков.
Рисунок 3. Возникновение гонок при доступе к разделяемым ресурсам
Рисунок 4. Влияние относительных скоростей потоков на результат решения задачи
Важным понятием синхронизации потоков является понятие «критической секции» программы. Критическая секция — это часть программы, результат выполнения которой может непредсказуемо меняться, если переменные, относящиеся к этой части программы, изменяются другими потоками в то время, когда выполнение этой части еще не завершено.
Критическая секция всегда определяется по отношению к определенным критическим данным, при несогласованном изменении которых могут возникнуть нежелательные эффекты. Во всех потоках, работающих с критическими данными, должна быть определена критическая секция. Заметим, что в разных потоках критическая секция состоит в общем случае из разных последовательностей команд.
Чтобы исключить эффект гонок по отношению к критическим данным, необходимо обеспечить, чтобы в каждый момент времени в критической секции, связанной с этими данными, находился только один поток. При этом неважно, находится этот поток в активном или в приостановленном состоянии. Этот прием называют взаимным исключением. Операционная система использует разные способы реализации взаимного исключения. Некоторые способы пригодны для взаимного исключения при вхождении в критическую секцию только потоков одного процесса, в то время как другие могут обеспечить взаимное исключение и для потоков разных процессов.
Способы реализации взаимных исключений: блокирующие переменные, критические секции, семафоры Дейкстры. Блокирующие переменные
Для синхронизации потоков одного процесса прикладной программист может использовать глобальные блокирующие переменные. С этими переменными, к которым все потоки процесса имеют прямой доступ, программист работает, не обращаясь к системным вызовам ОС.
Рисунок 5. Реализация критической секции с использованием блокирующих переменных
Каждому набору критических данных ставится в соответствие двоичная переменная, которой поток присваивает значение 0, когда он входит в критическую секцию, и значение 1, когда он ее покидает. На рисунке показан фрагмент алгоритма потока, использующего для реализации взаимного исключения доступа к критическим данным D блокирующую переменную F(D). Перед входом в критическую секцию поток проверяет, не работает ли уже какой-нибудь поток с данными D. Если переменная F(D) установлена в 0, то данные заняты и проверка циклически повторяется. Если же данные свободны (F(D) = 1), то значение переменной F(D) устанавливается в 0 и поток входит в критическую секцию. После того как поток выполнит все действия с данными О, значение переменной F(D) снова устанавливается равным 1.
Нельзя прерывать поток между выполнением операций проверки и установки блокирующей переменной. Во избежание таких ситуаций в системе команд многих компьютеров предусмотрена единая, неделимая команда анализа и присвоения значения логической переменной (например, команды ВТС, BTR и ВТ5 процессора Pentium). При отсутствии такой команды в процессоре соответствующие действия должны реализовываться специальными системными примитивами, которые бы запрещали прерывания на протяжении всей операции проверки и установки.
Источник: studfile.net