Цели и средства синхронизации

Основные вопросы, возникающие перед разработчиками операционных систем, связаны, в основном, с управлением процессами и потоками. Необходимо учитывать, что к современным ОС предъявляются, как минимум, следующие требования:

o Многозадачность – управление множеством процессов в однопроцессорной ОС;

o Многопроцессорность – управление множеством процессоров в многопроцессорной системе.

o Распределенные вычисления – управление множеством процессов, выполняемых в распределенной вычислительной системе на множестве компьютеров

Камнем преткновения в данной области является концепция параллельных вычислений (включая вопросы обмена информацией между процессами, разделение ресурсов, синхронизация работы процессов и распределение процессорного времени между процессами). Основным требованием поддержки параллельных процессов является возможность обеспечения взаимоисключений. Потребность в синхронизации потоков возникает особенно остро в мультипрограммной ОС и связана с совместным использованием аппаратных и информационных ресурсов вычислительной системы.

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

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

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

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

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

Для синхронизации процессов и потоков, решающих общие задачи и совместно использующие ресурсы, в операционных системах существуют специальные средства: критические секции, семафоры, мьютексы, события, таймеры.