
- •Раздел 3. Параллельное выполнение программ
- •3.1. Концепция процесса
- •3.2. Средства описания параллелизма
- •3.2.1. Графические средства
- •3.2.3. Описание процессов средствами uml
- •3.2.4. Языковые средства описания параллелизма
- •3.3. Организация ядра ос
- •3.3.1. Ядро как средство организации виртуальной машины
- •3.3.2. Состояния процесса и структура ядра
- •3.3.3. Дескрипторы процессов
- •3.3.4. Очереди процессов в ядре
- •3.4. Общая характеристика примитивов ядра
- •3.5. Примитивы создания и уничтожения процессов
- •3.6. Примитивы синхронизации процессов
- •3.6.1. Простейшие примитивы, не учтенные в классификации
- •3.6.2. Примитивы временной синхронизации
- •3.6.3. Примитивы событийной синхронизации процессов
- •3.7. Общий семафор как средство событийной синхронизации
- •3.8. Средства синхронизации в существующих операционных системах
- •3.9. Монитор как средство реализации взаимного исключения
- •3.10. Примитивы ядра для обмена сообщениями
- •3.10.1. Буфер как средство коммуникации между процессами
- •3.10.2. Почтовый ящик с очередью сообщений
- •3.10.3. Средства коммуникаций в существующих ос
- •3.11. Проблема тупиков при взаимодействии процессов
- •3.12. Планирование загрузки процессора в ядре
- •3.12.1. Классификация алгоритмов планирования
- •3.12.2. Тесты планируемости задач и классификация задач
- •3.12.3. Динамическое планирование
- •3.12.3.1. Планирование независимых задач
- •1. Алгоритм монотонной скорости.
- •2. Алгоритм “задача с минимальным предельным сроком завершения - первая”
- •3. Алгоритм минимальной неопределенности
- •3.12.3.2. Планирование зависимых задач
- •3.12.4. Статическое планирование
3.10.3. Средства коммуникаций в существующих ос
Современные ОС используют несколько механизмов коммуникаций между процессами. Перечислим эти механизмы.
Программные каналы. Используются в качестве простого механизма передачи данных между задачами на базе файлов. Каналы могут быть однонаправленными, когда они связывают пишущий и читающий компоненты, или двунаправленными, когда запись или чтение могут выполняться любой стороной. На самом деле канал не является файлом на диске, а представляет собой циклический буфер, модель которого мы рассмотрели выше.
Сообщения. Обеспечивают базовые примитивы для приема и передачи данных между процессами.
Семафоры. Используются для координации доступа между процессами и подробно обсуждены.
Разделяемая память. Предполагает выделение области памяти, доступной нескольким процессам для записи и выборки данных. Подробно будет рассмотрена в следующем разделе.
Хотя перечисленные средства обычно применяются на одной машине, существуют расширения, позволяющие процессам находиться в сети.
Программные каналы
Существуют неименованные и именованные программные каналы. Неименованные программные каналы используют для взаимодействия между родственными процессами, а именованные – между неродственными, которые в том числе могут работать и на разных машинах.
Linux
Linux поддерживает как неименованные, так и именованные программные каналы. Неименованные каналы являются стандартным механизмом коммуникаций. Каналы обеспечивают возможность двунаправленной передачи данных. При создании канала создаются два потока и связываются друг с другом. Поскольку используется стандартная файловая система, интерфейс для создания канала и доступа к нему очень прост. Создание неименованного программного канала осуществляется с помощью команды
pipe(fileDescriptor[2]).
При создании возвращается дескриптор fd файла для записи и чтения. Запись в fd[0] позволяет считывать данные из fd[1] и наоборот. Операции с каналами осуществляются с помощью обычных команд файловой системы:
read(), write().
Чтобы поток стал именованным, он должен подключиться к узлу файловой системы командой fattach(fileDescriptor, path). Эта команды выполняется на сервере сети. Клиенты выполняют команду open(path) и затем могут связываться друг с другом через данный канал. Отсоединение имени осуществляется командой fdetach(path).
Windows
Для обеспечения обмена данными между процессами с помощью программных каналов Windows предусматривает два режима:
неименованный однонаправленный;
именованный двунаправленный.
CreatePipe(readHandle, writeHandle, security,numBytes) - создается неименованный канал c размером, буфера - numBytes. readHandle, writeHandle - дескрипторы для чтения и записи; security - структура для описания прав доступа.
Для чтения и записи могут использоваться вызовы WriteFile() и ReadFile().
CreateNamedPipe(...) - создает именованный программный канал на серверной машине. В функцию передается масса параметров - имя, режим (двунаправленный, однонаправленный), размеры буферов, права доступа, величина таймаута.
ConnectNamedPipe() - ожидание процессом сервером запроса на открытие канала (вызова функции CallNamePipe процессом-клиентом).
DisconnectNamedPipe() - разъединение канала.
PeekNamedPipe() - копирование данных из буфера канала без удаления.
TransactNamePipe() - выполнение операции чтения из канала или записи в канал.
GetNamedPipeHandleState(), GetNamedPipeInfo() – получение информации о канале.
SetNamedPipeHandleState() - изменение параметров канала.
Очереди сообщений
Очереди сообщений - это более совершенный и более популярный механизм коммуникаций. Для работы с сообщениями предлагаются расширенные и мощные интерфейсы API.
Интерфейсы Linux
msgget() - создание очереди сообщений;
msgsnd() - занесение данных в очередь сообщений;
msgrcv() - извлечение сообщений из очереди;
msgctl() - управляющие операции с очередью, например, опрос состояния или удаление.
Интерфейсы Windows
Windows использует средство, называемое почтовой ячейкой, для коммуникаций между процессами. Обычно почтовую ячейку создает сервер и читает из нее данные, посылаемые клиентами.
CreateMailSlot - создание почтовой ячейки на серверном компьютере.
Клиент получает доступ к ячейке вызовом CreateFile.
GetMailSlotInfo - запрос информации о почтовой ячейке.
SetMailSlotInfo - установка параметров, в основном таймаута.