0:06
Здравствуйте!
Программной реализация взаимоисключений
являются семафоры, мониторы и программные каналы.
Одним из первых механизмов межпроцессного взаимодействия,
предложенных для синхронизации процессов,
стали семафоры, концепцию которых
описал Дейкстра в 1965 году.
Он предложил две операции — down и up.
Операция down сравнивает значение семафора с нулем.
Если значение семафора больше нуля,
операция down уменьшает его
и просто возвращает управление.
Если значение семафора равно нулю,
процедура down не возвращает управление процессу,
а процесс переводится в состояние ожидания.
Все операции проверки значения семафора,
его изменения и перевода процесса в состояние
ожидания выполняются как единое
и неделимое элементарное действие.
Тем самым гарантируется, что после начала операции
ни один процесс не получит доступа
к семафору до окончания или блокирования операции.
Атомарность операции чрезвычайно важна
для разрешения проблемы синхронизации
и предотвращения состояния состязания.
Операция up увеличивает значение семафора.
Если с этим семафором связаны один или несколько
ожидающих процессов, которые не могут завершить
более раннюю операцию down,
один из них выбирается системой
(например, случайным образом)
и ему разрешается завершить свою операцию.
Таким образом, после операции up,
примененной к семафору, связанному с несколькими
ожидающими процессами, значение семафора
так и останется равным 0,
но число ожидающих процессов уменьшится на единицу.
Операция увеличения значения семафора
и активизации процесса тоже неделима.
Ни один процесс не может быть блокирован
во время выполнения операции up,
как ни один процесс не мог быть блокирован во время
выполнения операции wakeup в предыдущей модели.
POSIX вызовы операции с семафорами — это
sem_init(), sem_wait(), sem_post().
Мьютекс — упрощенная версия семафора,
которая может находиться в одном из двух состояний —
блокированном или неблокированном.
POSIX вызовы операции —
это mutex_init(), mutex_lock() и mutex_destroy().
Конструкция монитор предложена в 1974 г. Хоаром.
Она является более высокоуровневой
и более надежной конструкцией для синхронизации,
чем семафоры.
Монитор является многовходовым модулем особого рода.
Он содержит описания общих для нескольких
параллельных процессов данных
и операций над этими данными в виде процедур P1, …, Pn.
Пользователи монитора — параллельные процессы —
имеют доступ к описанным в нем общим данным
только через его операции,
причем в каждый момент времени не более, чем один процесс
может выполнять какую-либо операцию монитора;
остальные процессы, желающие выполнить операцию монитора,
должны ждать, пока первый процесс
закончит выполнять мониторную операцию.
По сути дела, концепция монитора явилась
развитием абстрактного типа данных —
определения типа данных как совокупности описания
его конкретного представления и абстрактных операций
над ним (в виде процедур).
2:47
Концепция монитора добавляет к абстрактному типу данных
возможность синхронизации процессов по общим данным.
Для реализации ожидания внутри монитора
по различным условиям, вводятся условные переменные —
переменные с описаниями вида condition,
доступ к которым возможен только операциями wait и signal:
например, x.wait(); x.signal().
Операция x.wait() означает, что выполнивший ее процесс
задерживается до того момента, пока другой процесс
не выполнит операцию x.signal().
Операция x.signal() возобновляет
ровно один приостановленный процесс.
Если приостановленных процессов нет,
она не выполняет никаких действий.
Монитор является пассивным объектом в том смысле,
что это не процесс; его процедуры выполняются
только по требованию процесса.
Хотя по сравнению с семафорами мониторы
не представляют собой существенно
более мощного инструмента для синхронизации
параллельных взаимодействующих вычислительных процессов,
у них есть некоторые преимущества
перед более примитивными синхронизирующими средствами.
Во-первых, мониторы очень гибки.
В форме мониторов можно реализовать не только семафоры,
но и многие другие синхронизирующие операции.
Во-вторых, локализация всех разделяемых
переменных внутри тела монитора
позволяет избавиться от малопонятных конструкций
в синхронизируемых процессах.
Сложные взаимодействия процессов
можно синхронизировать наглядным образом.
В-третьих, мониторы дают процессам возможность
совместно использовать программные модули,
представляющие собой критические секции.
Если несколько процессов совместно используют ресурс
и работают с ним совершенно одинаково,
то в мониторе нужна только одна процедура,
тогда как решение с семафорами требует,
чтобы в каждом процессе имелся собственный
экземпляр критической секции.
Таким образом, мониторы обеспечивают
по сравнению с семафорами значительное упрощение
организации взаимодействующих вычислительных процессов
и большую наглядность
при лишь незначительной потере в эффективности.
Приведем некоторые примеры параллельных задач,
требующие синхронизации. Например, веб-сервер,
который должен обслуживать несколько запросов параллельно.
Ожидая данные по запросу клиента из базы данных,
сервер может загружать данные с диска
или другого клиента, или принимать запрос от третьего.
Веб-браузер. В момент обращения к странице
он может загружать данные из различных источников
для ускорения открытия страницы в целом.
Современные приложения практически всегда используют
механизмы, позволяющие распараллеливать выполнение задач.
А с учетом выпуска многоядерных процессоров
можно получить существенный прирост в производительности,
используя несколько потоков вычисления.
Спасибо за внимание!