- •Н.В.Вдовикина, а.В.Казунин, и.В.Машечкин, а.Н.Терехин Системное программное обеспечение: взаимодействие процессов.
- •Часть I. Теоретические основы. 5
- •Часть II. Реализация процессов. 34
- •Часть III. Реализация взаимодействия процессов. 62
- •6.4Семафоры. 116
- •Часть I. Теоретические основы.
- •Введение.
- •Понятие процесса.
- •Некоторые типы процессов.
- •«Полновесные процессы»
- •«Легковесные процессы»
- •Жизненный цикл процесса.
- •Синхронизация параллельных процессов.
- •Способы реализации взаимного исключения.
- •Запрещение прерываний и специальные инструкции.
- •Алгоритм Петерсона.
- •Активное ожидание.
- •Семафоры.
- •Мониторы.
- •Дополнительная синхронизация: переменные-условия.
- •Обмен сообщениями.
- •Синхронизация.
- •Адресация.
- •Длина сообщения.
- •Классические задачи синхронизации процессов.
- •«Обедающие философы»
- •Задача «читателей и писателей»
- •Задача о «спящем парикмахере»
- •Часть II. Реализация процессов.
- •Реализация процессов в ос unix
- •Понятие процесса в unix.
- •Контекст процесса.
- •Тело процесса.
- •Аппаратный контекст.
- •Системный контекст.
- •Аппарат системных вызов в oc unix.
- •Порождение новых процессов.
- •Порождение сыновнего процесса. Идентификаторы процессов.
- •Порождение сыновнего процесса. Одновременное выполнение.
- •Механизм замены тела процесса.
- •Запуск на выполнение команды ls.
- •Вызов программы компиляции.
- •Использование схемы fork-exec
- •Завершение процесса.
- •Использование системного вызова wait()
- •Использование системного вызова wait()
- •Жизненный цикл процесса в ос unix.
- •Начальная загрузка. Формирование о и 1 процессов.
- •Планирование процессов в ос unix.
- •Планирование процессов.
- •Принципы организация свопинга.
- •Часть III. Реализация взаимодействия процессов.
- •Элементарные средства межпроцессного взаимодействия.
- •Сигналы.
- •Обработка сигнала.
- •Удаление временных файлов при завершении программы.
- •Программа “Будильник”.
- •Двухпроцессный вариант программы “Будильник”.
- •Надежные сигналы.
- •Работа с сигнальной маской.
- •Использование надежных сигналов.
- •Программные каналы
- •Использование канала.
- •Реализация конвейера.
- •Совместное использование сигналов и каналов – «пинг-понг».
- •Именованные каналы (fifo)
- •Модель «клиент-сервер».
- •Нелокальные переходы.
- •Использование нелокальных переходов.
- •Трассировка процессов.
- •Общая схема использования механизма трассировки.
- •Трассировка процессов.
- •Средства межпроцессного взаимодействия System V.
- •Организация доступа и именования в разделяемых ресурсах.
- •Именование разделяемых объектов.
- •Генерация ключей: функция ftok().
- •Общие принципы работы с разделяемыми ресурсами.
- •Очередь сообщений.
- •Доступ к очереди сообщений.
- •Отправка сообщения.
- •Получение сообщения.
- •Управление очередью сообщений.
- •Использование очереди сообщений.
- •Основной процесс.
- •Очередь сообщений. Модель «клиент-сервер»
- •Разделяемая память
- •Создание общей памяти.
- •Доступ к разделяемой памяти.
- •Открепление разделяемой памяти.
- •Управление разделяемой памятью.
- •Общая схема работы с общей памятью в рамках одного процесса.
- •Семафоры.
- •Доступ к семафору
- •Операции над семафором
- •Управление массивом семафоров.
- •Работа с разделяемой памятью с синхронизацией семафорами.
- •1Й процесс:
- •2Й процесс:
- •Взаимодействие процессов в сети.
- •Механизм сокетов.
- •Типы сокетов. Коммуникационный домен.
- •Создание и конфигурирование сокета. Создание сокета.
- •Связывание.
- •Предварительное установление соединения. Сокеты с установлением соединения. Запрос на соединение.
- •Сервер: прослушивание сокета и подтверждение соединения.
- •Прием и передача данных.
- •Завершение работы с сокетом.
- •Резюме: общая схема работы с сокетами.
- •Работа с локальными сокетами.
- •Пример работы с сокетами в рамках сети.
- •Среда параллельного программирования mpi
- •Краткий обзор параллельных архитектур.
- •Системы с распределенной памятью – mpp.
- •Системы с общей памятью – smp.
- •Системы с неоднородным доступом к памяти – numa.
- •Кластерные системы.
- •Модель программирования mpi.
- •Функции общего назначения. Общая структура программы.
- •Коммуникаторы и группы.
- •Обрамляющие функции. Инициализация и завершение.
- •Синхронизация: барьеры.
- •Использование барьерной синхронизации.
- •Прием и передача данных. Общие замечания.
- •Сообщения и их атрибуты.
- •Поддержка типов данных в mpi.
- •Коммуникации «точка-точка». Блокирующий режим.
- •Отправка сообщений в блокирующем режиме.
- •Режимы буферизации.
- •Прием сообщений в блокирующем режиме.
- •Mpi: прием сообщения, размер которого неизвестен заранее.
- •Коммуникации «точка-точка». Неблокирующий режим.
- •Отсылка и прием сообщений в неблокирующем режиме.
- •Работа с квитанциями.
- •Mpi: коммуникации «точка-точка». «Пинг-понг».
- •Коллективные коммуникации.
- •Коллективный обмен данными.
- •Коллективный обмен, совмещенный с обработкой данных.
- •Mpi: применение коллективных коммуникаций.
- •Алфавитный указатель упоминаемых библиотечных функций и системных вызовов.
- •Список литературы
-
Обмен сообщениями.
Общей проблемой и для мониторов, и для семафоров является то, что их реализация существенно опирается на предположение, что мы имеем дело либо с однопроцессорной системой, либо с многопроцессорной системой, где все процессоры имеют доступ к общей памяти. Однако в случае распределенной системы, где каждый процессор имеет прямой доступ только к своей памяти, такие средства не подходят. Более общим средством, решающим проблему синхронизации как для однопроцессорных систем и систем с общей памятью, так и для распределенных, является обмен сообщениями.
Обмен сообщениями представляет собой средство, которое может быть использовано как для синхронизации, в частности для организации взаимного исключения, так и для обмена информацией между взаимосвязанными процессами, выполняющими общую работу. Рассмотрим общую концепцию обмена сообщениями. Основная функциональность реализуется двумя примитивами, реализующими, соответственно, посылку и прием сообщения:
send(destination, message)
receive(source, message)
Как и семафоры, и в отличие от мониторов, эти примитивы являются системными вызовами, а не конструкциями языка.
Рассмотрим основные особенности, которыми может обладать та или иная система обмена сообщениями.
Синхронизация.
Сам смысл обмена сообщениями предполагает определенную синхронизацию между процессом-отправителем и процессом-получателем, так как сообщение не может быть получено до того, как оно послано. Возникает вопрос, что происходит, если один процесс хочет получить сообщение, а другой его не отослал, и наоборот, если один процесс отсылает сообщение, а другой не собирается его получать. Здесь есть две возможности. Как операция посылки сообщения, так операция приема могут быть блокирующими и неблокирующими. Для операции send это означает, что либо процесс-отправитель может блокироваться до тех пор, пока получатель не вызовет receive, либо выполнение процесса может продолжаться далее независимо от наличия получателя. Для операции receive подобная ситуация возникает, когда эта операция вызвана раньше, чем сообщение было послано – в этом случае она может либо блокироваться до получения сообщения, либо возвращать управление сразу же.
В зависимости от целей использования механизма сообщений могут быть полезны различные комбинации этих условий:
-
Блокирующий send и блокирующий receive – эта схема известна под названием «схемы рандеву». Она не требует буферизации сообщений и часто используется для синхронизации процессов
-
Неблокирующий send и блокирующий receive – такая схема очень распространена в системах клиент/сервер: серверный процесс блокируется в ожидании очередного запроса для обработки, в то время как клиент, пославший запрос серверу, может продолжать выполняться, не ожидая окончания обработки своего запроса
-
Также весьма распространена схема, когда обе операции являются неблокирующими – в этом случае оба процесса могут продолжать выполнение, не дожидаясь окончания коммуникации
Важно понимать, что в случае, если send является неблокирующим, процесс-отправитель не может знать, получено ли его сообщение. В этом случае, если требуется организовать гарантированную доставку сообщений, необходимо, чтобы процессы обменивались сообщениями-подтверждениями. Проблема потери сообщений встает также, если используется блокирующий receive – в этом случае процесс-получатель может оказаться заблокированным навечно. Поэтому в такую схему часто добавляется дополнительный примитив, позволяющий процессу-получателю проверить, есть ли для него сообщение, но не блокироваться, если его нет.