Операционные системы
Учебное пособие
Долгов В.В. |
1. Способы синхронизации работы процессов в среде Windows Windows К стандартным способам синхронизации работы нескольких процессов можно отнести такие объекты как критическая секция, событие, семафор. Каждый из этих способов обладает определенным функциональным наполнением и различным поведением. Так критическая секция предназначена для разграничения доступа к некоторому уникальному1 ресурсу нескольких процессов конкурирующих за этот ресурс. На практике, реализация механизма критической секции сводится к разделению во времени моментов выполнения участков различных процессов с помощью системных вызовов «Вход в критическую секцию»(Enter) и «Выход из критической секции»(Leave) (рис. 1). рис. 1. Схема реализации механизма «критической секции» Событие используется в случаях, когда одному из процессов необходимо сообщить другому(им) процессу(ам) о выполнении некоторого условия (завершение расчета, окончание операции, получение данных и т.д.). При этом ожидающие события процессы будет переведены операционной системой в состояние «ожидание» и не будут занимать процессорного времени до момента наступления требуемого события. Семафоры, представляемые неотрицательными целочисленными переменными, используются для контроля доступа процессов к нескольким однотипным уникальным ресурсам, помогая быстро определить существование свободного экземпляра требуемого ресурса (но не сам экземпляр). Семафор является более общим способом синхронизации по отношению к критической секции, поскольку последняя может быть реализована с помощью семафора, максимальное значения счетчика которого установлено в единицу. В ОС Windows критическая секция реализована в виде объекта «Mutex», а событие и семафор в виде соответствующих им по названию объектов «Event» и «Semaphore». Эти объекты создаются с помощью функций CreateMutex(…), CreateEvent(…) и CreateSemaphore(…) соответственно, а уничтожаются с помощью функции CloseHandle(…). Среди функций непосредственной работы с указанными объектами стоит отдельно выделить функцию WaitForSingleObject(…) «ожидающую» каждый из объектов (в общем случае любой объект в ядре ОС, для которого применимо понятие «ждать»). При этом «ожидание» для объекта Mutex соответствует операции «Вход в критическую секцию», для объекта Event – ожидание наступления события, а для объекта Semaphore – ожидание и захват свободой единицы ресурса. Выход из критической секции осуществляется функцией ReleaseMutex(…), а освобождение семафора – ReleaseSemaphore(…). Поведение события после завершения ожидания зависит от типа события: события с ручным сбросом остаются установленными; с автоматическим – сбрасываются сразу после того, как любой процесс дождется момента его установки. 1 Уникальным будем называть такой ресурс, одновременная работа с которым по некоторым причинам может осуществляться только одним процессом (потоком). Реализовать процесс, осуществляющий вывод текстового файла на консоль. Считая консоль уникальным ресурсом, блокировать процесс вывода на неё всего файла с помощью критической секции. Запустить несколько экземпляров процесса и проверить, что единовременно на экран будет выводиться информация только из одного файла. Реализовать два процесса, один из которых дожидается нажатия клавиши (или кнопки на окне) и сообщает об этом другому процессу с помощью события. После того, как второй процесс дождется события, он должен вывести на экран сто разноцветных геометрических фигур. На бензозаправке было построено 4 заправочных места. Считая их одинаковыми, подсчитать, какое количество машин вынуждено было проехать мимо, так как все места были заняты. Новая машина подъезжает к заправке через 1-2 мин. Время заправки одной машины – 1-4 мин. Для контроля количества свободных мест на заправке использовать семафор. |