Изучение средств синхронизации процессов и потоков в ОС Windows: Методические рекомендации по выполнению лабораторной работы

Страницы работы

Содержание работы

СИНХРОНИЗАЦИЯ    ПРОЦЕССОВ  И  ПОТОКОВ   В  ОС   WINDOWS

Лабораторная    работа      № 2

1.    ЦЕЛЬ    РАБОТЫ

Изучение средств синхронизации процессов и потоков в ОС Windows, приобретение практических навыков их использования в прикладных программах.

2.  ОСНОВНЫЕ СВЕДЕНИЯ

2.1.  Содержание и цели  синхронизации

В мультипрограммных  ОС процессы и потоки совместно используют аппаратные и программные ресурсы вычислительной системы. Без принятия соответствующих управляющих действий процессы и потоки будут выполняться независимо, асинхронно друг от друга. При этом могут возникать гонки, тупики и взаимные блокировки процессов.

Пусть, например, один поток собирается открыть файл А, а потом файл В. Другой поток намеревается открыть файл В, а затем файл А. Пусть первый поток открыл файл А и пытается открыть файл В, и при попытке открыть файл В обнаруживает, что файл В уже открыт вторым потоком. Тогда первый поток переходит в состояние ожидания освобождения файла В. Но при этом второй поток, открывший файл В, пытается открыть файл А и узнает, что этот файл уже открыт. Поэтому второй  поток тоже переходит в режим ожидания. Следовательно, оба потока начинают ждать друг друга, и этот процесс ожидания может длиться сколько угодно долго. Произошла тупиковая ситуация - взаимная блокировка потоков (deadlock). Одним из способов решения этой проблемы состоит в том, чтобы поток освобождал все занятые им ресурсы, если он не может получить доступ к одному из нужных ему ресурсов (по принципу «все или ничего»).

Для исключения конфликтов процессов и потоков предназначена их синхронизация. Суть синхронизации состоит в том, чтобы заставить один процесс или поток ждать, пока другой не закончит какую-то определенную заранее операцию. Например, пусть активному потоку нужно получить доступ к последовательному порту. Но в это время с этим портом работает другой поток. Тогда ОС приостанавливает активный поток до момента освобождения требуемого порта.

Синхронизация может быть выполнена средствами прикладной программы и средствами ОС. Более универсальными и эффективными являются средства ОС. В ОС Windows предусмотрены, в частности, следующие основные объекты синхронизации:

события,

мьютексы,

семафоры.

Объектами синхронизации называют специальные системные объекты, которые видны всем потокам, в том числе и тем, которые принадлежат разным процессам. Объекты могут находиться в двух состояниях: сигнальном (свободном, signaled) и занятом (несигнальном, unsignaled). Смысл «сигнальное состояние» (signaledstate)  зависит от контекста. Например, поток переходит в сигнальное состояние, когда он заканчивается. Файл переходит в сигнальное состояние, когда операция ввода-вывода для этого файла завершается. Семафор находится в сигнальном состоянии, если его счетчик больше нуля, мьютекс – если он освобожден. Событие находится в сигнальном состоянии, если его флаг установлен (событие произошло).

Объекты синхронизации используются сходным образом. Для создания объекта вызывается функция создания объекта (например, CreateMutexдля создания мьютекса). Если объект синхронизации будет использоваться только текущим процессом и его потомками, то при создании можно не указывать  имя объекта. Открытие существующего объекта для использования другими процессами выполняется функцией открытия (например, OpenMutex). Освобождение объекта осуществляется функцией типа ReleaseMutex. Для других объектов синхронизации используются аналогичные функции.

Следить за состоянием объектов синхронизации можно с помощью специальных системных вызовов. Чаще всего для этого используют функцию WaitForSingleObject(). Функция проверяет, находится ли соответствующий объект в сигнальном состоянии. Когда функция при вызове устанавливает, что объект имеет сигнальное состояние, то она тут же возвращает управление вызвавшей программе и сообщает ей об изменении состояния объекта.

Синтаксис этой функции:

DWORD WaitForSingleObject(

    HANDLE hHandle,                      // дескриптор объекта

    DWORD dwMilliseconds// временной интервал ожидания в миллисекундах

).

 Параметр hHandle – идентификатор (хэндл) объекта. Второй параметр dwMilliseconds устанавливает интервал времени ожидания перехода  в сигнальное состояние (в милисекундах). Если этот параметр имеет значение 0, то функция проверяет состояние объекта (свободное или занятое) и возвращается, при значении параметра  INFINITE  функция будет ожидать перехода в сигнальное состояние сколько угодно долго. Если объект так и не освобождается, то поток остается в неактивном состоянии и никогда не получит процессорного времени.

            Функция WaitForSingleObject может возвращать одно из следующих значений:

WAIT_OBJECT_0  - объект перешел в свободное состояние,

WAIT_TIMEOUT – временной интервал истек и объект не перешел в свободное состояние,

WAIT_ABANDONED – процесс, владеющий  мьютексом, завершает работу с ним, и система передает мьютекс ожидающему потоку  («отказ от мьютекса»),

WAIT_FAILED – произошла ошибка, причину которой можно узнать, вызвав функцию GetLastError.

            Функция WaitForMultipleObjects() позволяет следить за состоянием сразу нескольких объектов синхронизации. В качестве одного из аргументов в этой функции имеется массив объектов синхронизации. Если хотя бы один из объектов переходит в сигнальное состояние, то функция возвращает сведения том, какой объект изменил свое состояние. При вызове функции можно указать интервал времени, в течение которого следует ожидать изменеие состояния объектов. Интервал времени может быть любым, в том числе 0 и INFINITE (неограниченное время).   В зависимости от значения аргумента-флага bWaitAll функция возвращает управление вызвавшей её программе либо в момент, когда своё состояние изменяют все объекты (аргумент bWaitAll = TRUE),  либо когда в сигнальное состояние перейдет хотя бы один из объектов (bWaitAll = FALSE),  либо по истечении заданного интервала времени.

2.2.  События (events)

 В некоторых случаях потоку необходимо ждать, пока другие потоки не завершат выполнение каких-либо операций или не произойдет какое-либо событие, инициированное пользователем. Событие, как объект синхронизации,  можно использовать, когда один поток должен известить другой о том, что он завершил ту или иную операцию (установить флаг события). Например, один поток опрашивает датчики и загружает результаты измерений в буфер. Другой поток должен считывать данные из буфера. Первый поток может извещать второй, что событие- заполнение буфера – наступило. Таким образом, события обычно используются для синхронизации потоков, работающих по принципу конвейера.

Похожие материалы

Информация о работе