Процессы и потоки в ОС. Необходимость синхронизации при работе с общими ресурсами. Способы синхронизации.
В многопоточной среде часто возникают проблемы, связанные с использованием параллельно исполняемыми потоками одних и тех же данных или устройств. Напр., передача инф от одного процесса к другому, контроль над деят-ю процессов(2 пр не пересекутся в критической ситуации, напр., когда они пытаются завладеть последним мегабайтом памяти ), согласование действий процессов. Для решения подобных проблем используются методы взаимодействия потоков:
Взаимоисключения (mutex, мьютекс) — это объект синхронизации, который устанавливается в особое сигнальное состояние, когда не занят каким-либо потоком. Только один поток владеет этим объектом в любой момент времени, одновременный доступ к общему ресурсу исключается. После всех необходимых действий мьютекс освобождается, предоставляя другим потокам доступ к общему ресурсу. Состояние описывается: владельцем и кратностью(целое >=0). Операции: Lock(), Unlock(). Достоинства: автоматич освобождение(если владелец «помер»),более быстр чем семафор.
Семафоры представляют собой доступные ресурсы, которые могут быть приобретены несколькими потоками в одно и то же время, пока пул ресурсов не опустеет. Тогда дополнительные потоки должны ждать, пока требуемое количество ресурсов не будет снова доступно. Семафоры очень эффективны, поскольку они позволяют одновременный доступ к ресурсам. Dec и Inc семафора. Если семафор=0 и нужно dec, то в очередь и ожидание inc. Поставщик: while(true){s1.dec();putdata(); s2.inc();}. Покупатель: while(true){s2.dec(); getdata(); s1.inc();}.
События. Объект, хранящий в себе 1 бит информации «просигнализирован или нет», над которым определены операции «просигнализировать», «сбросить в непросигнализированное состояние» и «ожидать». Ожидание на просигнализированном событии есть отсутствие операции с немедленным продолжением исполнения потока. Ожидание на непросигнализированном событии приводит к приостановке исполнения потока до тех пор, пока другой поток (или же вторая фаза обработчика прерывания в ядре ОС) не просигнализирует событие. Возможно ожидание нескольких событий в режимах «любого» или «всех». Возможно также создания события, автоматически сбрасываемого в непросигнализированное состояние после пробуждения первого же — и единственного — ожидающего потока (такой объект используется как основа для реализации объекта «критическая секция»). Активно используются в MS Windows, как в режиме пользователя, так и в режиме ядра.
Активно используются в MS Windows, нет в Unix (вместо него исп-ся семафор). Состояния: up/down or on/off or true/false… Операции: set()- установить в состояние up, reset()-сбросить, wait(), pulse()-делает up, пропускает очередь и затем сразу down.
Критические секции обеспечивают синхронизацию подобно мьютексам за исключением того, что объекты, представляющие критические секции, доступны в пределах одного процесса. Критич секция - объект ОС, контролируемый ОС, находящийся внутри процесса (исп-ся для синхронизации нитей внутри одного процесса). Состояния: занят/свободен. Операции: enter(войти в критич секцию), leave(выйти).
Часть программы, в кот есть обращение к совместно используемым данным, наз критич секцией.(Пр А попадает в кр область, позже пр В пытается попасть в кр область, но ему не удается, и он ожидает. Когда А выходит из кр области, пр В занимает ее.)
Критическая секция – средство синхронизации нитей внутри одного процесса
Объект-критическая секция помогает программисту выделить участок кода, где нить получает доступ к разделяемому ресурсу, и предотвратить одновременное использование ресурса.
10.Механизмы синхронизации. Понятие семафора (Semaphore) и основные операции с ним. Двоичный семафор. Объект, позволяющий войти в заданный участок кода не более чем n потокам.
Первый механизм синхронизации, изобрел его 1967 году Дэйкстра.Семафоры представляют собой доступные ресурсы, которые могут быть приобретены несколькими потоками в одно и то же время, пока пул ресурсов не опустеет. Тогда дополнительные потоки должны ждать, пока требуемое количество ресурсов не будет снова доступно. Семафоры очень эффективны, поскольку они позволяют одновременный доступ к ресурсам. Классическое определение этих операций выглядит следующим образом:
P(S): | пока S == 0 процесс блокируется; S = S – 1; |
V(S): | S = S + 1; |
Эта запись означает следующее: при выполнении операции P над семафором S сначала проверяется его значение. Если оно больше 0, то из S вычитается1. Если оно меньше или равно0, то процесс блокируется до тех пор, пока S не станет больше 0, после чего из S вычитается 1. При выполнении операции V над семафором S к его значению просто прибавляется 1. Наиболее простым случаем семафора является двоичный семафор.Начальное значение флаговой переменной такого семафора равно 1, и вообще онаможет принимать только значения 1 и 0. Двоичный семафор соответствует случаю,когда с разделяемым ресурсом в каждый момент времени может работать толькоодна программа. Двоичный семафор может принимать два значения: 0 (семафор закрыт) и 1 (семафор открыт). Двоичный семафор соответствует случаю, когда с разделяемым ресурсом в каждый момент времени может работать только одна программа.
11.Механизмы синхронизации. Понятие мьютекса (Mutex) и основные операции с ним. Пример использование мьютекса для синхронизации нитей. Взаимоисключения (mutex, мьютекс) — это объект синхронизации, который устанавливается в особое сигнальное состояние, когда не занят каким-либо потоком. Только один поток владеет этим объектом в любой момент времени, одновременный доступ к общему ресурсу исключается. После всех необходимых действий мьютекс освобождается, предоставляя другим потокам доступ к общему ресурсу. Состояние описывается: владельцем и кратностью(целое >=0). Операции: Lock(), Unlock().Достоинства:автоматич освобождение(если владелец «помер»),более быстр чем семафор.Мьютекс используется для блокировки доступа к к-л уникальному ресурсу.Синхронизация нитей в ОС Windows
В Windows реализована вытесняющая многозадачность - это значит, что в любой момент система может прервать выполнение одной нити и передать управление другой. Ранее, в Windows 3.1, использовался способ организации, называемый кооперативной многозадачностью: система ждала, пока нить сама не передаст ей управление и именно поэтому в случае зависания одного приложения приходилось перезагружать компьютер.
Все нити, принадлежащие одному процессу, разделяют некоторые общие ресурсы - такие, как адресное пространство оперативной памяти или открытые файлы. Эти ресурсы принадлежат всему процессу, а значит, и каждой его нити. Следовательно, каждая нить может работать с этими ресурсами без каких-либо ограничений. Но... Если одна нить еще не закончила работать с каким-либо общим ресурсом, а система переключилась на другую нить, использующую этот же ресурс, то результат работы этих нитей может чрезвычайно сильно отличаться от задуманного. Такие конфликты могут возникнуть и между нитями, принадлежащими различным процессам. Всегда, когда две или более нитей используют какой-либо общий ресурс, возникает эта проблема.
Именно поэтому необходим механизм, позволяющий потокам согласовывать свою работу с общими ресурсами. Этот механизм получил название механизма синхронизации нитей (thread synchronization).Объектов синхронизации существует несколько, самые важные из них - это взаимоисключение (mutex), критическая секция (critical section), событие (event) и семафор (semaphore). Каждый из этих объектов реализует свой способ синхронизации. Также в качестве объектов синхронизации могут использоваться сами процессы и нити (когда одна нить ждет завершения другой нити или процесса); а также файлы, коммуникационные устройства, консольный ввод и уведомления об изменении.
Чтобы создать тот или иной объект синхронизации, производится вызов специальной функции WinAPI типа Create... (напр. CreateMutex). Этот вызов возвращает дескриптор объекта (HANDLE), который может использоваться всеми нитями, принадлежащими данному процессу.