- •Н.В.Вдовикина, а.В.Казунин, и.В.Машечкин, а.Н.Терехин Системное программное обеспечение: взаимодействие процессов.
- •Часть 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: применение коллективных коммуникаций.
- •Алфавитный указатель упоминаемых библиотечных функций и системных вызовов.
- •Список литературы
-
Способы реализации взаимного исключения.
-
Запрещение прерываний и специальные инструкции.
-
Простейшее умозаключение, которое, на первый взгляд, решает проблему синхронизации доступа к критическим ресурсам, заключается в следующем: некорректная работа с разделяемыми ресурсами возникает в том случае, если переключение процессов происходит в тот момент, когда выполняющийся процесс начал работу с разделяемым ресурсом, но не закончил ее, т.е. находится в своей критической секции. Чтобы этого не происходило, процесс должен запретить все прерывания непосредственно после входа в критическую секцию и разрешить их перед самым выходом из нее. Если прерывания запрещены, то переключения процессов не происходит, так как передача управления планировщику может быть реализована только с использованием прерываний (это может быть как прерывание по таймеру, так и другие прерывания, например, при заказе обмена). Таким образом, запрещение прерываний гарантирует процессу, что никакой другой процесс не обратится к разделяемому ресурсу, пока прерывания не будут разрешены.
Этот подход, однако, имеет ряд существенных недостатков. Первым из них является снижение общей производительности системы вследствие ограничения возможности переключения процессов для оптимальной загрузки процессора. Другая проблема заключается в том, что нет никаких гарантий, что процесс, запретивший прерывания, не зациклится в своей критической секции, тем самым приведя систему в полностью неработоспособное состояние. Цена программной ошибки здесь становится слишком высокой. Кроме всего прочего, для многопроцессорной системы запрещение прерываний не гарантирует даже взаимного исключения, так как запрещение прерываний на одном из процессоров никак не влияет на исполнение процессов на других процессорах ВС, и эти процессы по-прежнему имеют доступ к разделяемому ресурсу, например, ячейке общей памяти.
Для организации взаимного исключения на многопроцессорной системе с общей памятью могут использоваться специальные машинные инструкции. Примером такой инструкции может служить TSL – test and set lock, реализующая чтение ячейки памяти и запись нового значения в ту же ячейку как единую операцию. При этом гарантируется, что совокупность операций чтения и записи ячейки памяти является неделимой, т.е. доступ к ячейке памяти со стороны других процессоров блокируется на все время исполнения инструкции. Вариацией этой идеи является специальная инструкция exchange, которая меняет местами содержимое регистра и ячейки памяти. Здесь опять гарантируется, что на все время выполнения инструкции доступ к ячейке памяти блокируется.
Используя эти инструкции и дополнительную разделяемую переменную, значение которой говорит о том, можно ли в данный момент войти в критическую секцию, процессы могут синхронизировать свою работу. Возможность считывать старое значение и записывать новое за одну операцию позволяет избежать ситуации, когда процесс, считав значение переменной, говорящее ему о том, что он может войти в свою критическую секцию, не успеет изменить ее значение на «занято» и будет в этот момент прерван; другой же процесс, получивший управление, считает неизмененное значение переменной, которое позволит и ему войти в критическую секцию, в результате чего два процесса одновременно окажутся в критических секциях.