Проблема синхронизации

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

Рис. 2.3.  Пример необходимости синхронизации

Пренебрежение вопросами синхронизации процессов, которые выполняются в режиме мультипрограммирования, может привести к их неправильной работе или даже к краху системы. Рассмотрим, например (рисунок 2.3), программу печати файлов (принт-сервер). Эта программа печатает поочередно все файлы, имена которых последовательно в порядке поступления записывают в специальный общедоступный файл "заказ" другие программы. Особая переменная NEXT, также доступная всем процессам-клиентам, содержит номер первый свободной для записи имени файла позиции файла "заказ". Процессы-Клиенты читают эту переменную, записывают в соответствующую позицию файла "заказ" имя своего файла и наращивают значение NEXT на единицу. Предположим, что в некоторый момент процесс R решил распечатать свой файл, для этого он прочитал значение переменной NEXT, значение которой для уверенности предположим равным 4. Процесс запомнил это значение, но поместить имя файла не успел, потому что его выполнение было прервано (например, в следствие исчерпания кванта). Очередной процесс S, что желает распечатать файл, прочитал то же самое значение переменной NEXT, поместил в четвертую позицию имени своего файла и нарастил значение переменной на единицу. Когда в очередной вместе управления будет передан процесс R, то он, продолжая свое выполнение, в полном соответствии со значением текущей свободной позиции, полученным во время предыдущей итерации, запишет имя файла также в позицию 4, сверх имени файла процесса S.

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

 

Возможно стоит прочитать: