Наверх Системное программирование
Предыдущий раздел Оглавление Следующий раздел

ЛАБОРАТОРНАЯ РАБОТА № 6

Межпроцессное взаимодействие

Цель работы: Изучение механизмов межпроцессного взаимодействия (InterProcess Communication) в Windows NT. Получение практических навыков по использованию Win32 API для программирования механизмов IPC.

Методические указания к выполнению лабораторной работы

Отображение файлов (file mapping)

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

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

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

Операции, необходимые для создания отображения файлов, чтения/записи отображений и корректного завершения работы, рассмотрены в лабораторной работе №2.

Почтовые ящики (mailslot)

Почтовые ящики обеспечивают только однонаправленные соединения. Каждый процесс, который создает почтовый ящик, является "сервером почтовых ящиков" (mailslot server). Другие процессы, называемые "клиентами почтовых ящиков" (mailslot clients), посылают сообщения серверу, записывая их в почтовый ящик. Входящие сообщения всегда дописываются в почтовый ящик и сохраняются до тех пор, пока сервер их не прочтет. Каждый процесс может одновременно быть и сервером и клиентом почтовых ящиков, создавая, таким образом, двунаправленные коммуникации между процессами.

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

Когда процесс создает почтовый ящик, имя последнего должно иметь следующую форму:

\\.\mailslot\[path]name

Если же ваша цель передать сообщение всем mailslot’ам с указанным именем внутри домена, вам понадобится NETBIOS-имя домена:

\\DomainName\mailslot\[path]name

Клиенты и серверы, использующие почтовые ящики, при работе с ними должны пользоваться функциями, представленными в [1], с. 67-68.

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

  1. Создание почтового ящика (CreateMailslot).
  2. Запись сообщений в почтовый ящик (WriteFile).
  3. Чтение сообщений из почтового ящика (ReadFile).

Каналы (pipe)

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

При создании и получении доступа к существующему каналу необходимо придерживаться следующего стандарта имен каналов:

\\.\pipe\pipename

Если канал находится на удаленном компьютере, то потребуется NETBIOS-имя компьютера:

\\ComputerName\pipe\pipename

Функции работы с каналами приведены в [1], с. 71.

Задание для выполнения лабораторной работы

Разработать программу, реализующую решение одной из следующих задач согласно варианту с помощью механизмов межпроцессного взаимодействия. Способ межпроцессного взаимодействия выбирается исходя из особенностей поставленной задачи.

№ варианта Задание
1 Реализовать алгоритм блочной сортировки файла целых чисел. Каждый процесс, выполняющий сортировку, получает свою часть файла от ведущего процесса и сортирует его. Ведущий процесс выполняет упорядочивание уже отсортированных блоков. При необходимости ведомым процессам может быть выделено более одного задания на сортировку.
2 Реализовать алгоритм блочного нахождения максимального числа. Каждый из клиентов получает свою часть файла от ведущего процесса, ищет максимальное число в своем блоке и передает это число серверу. Ведущий процесс (сервер) выбирает максимальное из чисел, переданных клиентами.
3 Реализовать обмен текстовыми сообщениями между несколькими процессами. Обеспечить возможность отправки сообщения сразу нескольким адресатам. Реализовать подтверждение приема сообщения адресатом или, в случае потери сообщения, повторную его передачу.
4 Реализовать обмен текстовыми сообщениями между несколькими процессами. Обеспечить возможность отправки сообщения сразу нескольким адресатам, при этом среди сообщений есть зарезервированные слова-команды, требующие выполнения каких-либо действий.
5 Реализовать обмен текстовыми сообщениями между несколькими процессами (Чат). Обеспечить возможность отправки сообщения сразу нескольким адресатам. Сервер хранит номера и имена клиентов и ведет статистику вопросов клиентов.
6 Реализовать вычисление определителя квадратной матрицы с помощью разложения ее на определители меньшего порядка. При этом "ведущий" процесс рассылает задания "ведомым" процессам, последние выполняют вычисление определителей, а затем главный процесс вычисляет окончательный результат.
7 Реализовать перемножение двух матриц с помощью нескольких процессов: каждый процесс выполняет перемножение строки первой матрицы на столбец второй (в соответствии с правилом умножения матриц). При необходимости процессам, выполняющим умножение, может быть отправлено несколько заданий.
8 Реализовать тест по операционным системам на основе клиент-серверной технологии. Клиент генерирует номер вопроса и запрашивает у сервера его содержимое и варианты ответов. Клиент отсылает номер ответа для проверки серверу.
9 Разработать программу, в которой ведущий процесс рассылает ведомым время их работы, определяемое случайным образом, а ведомые процессы автоматически закрываются по окончании этого времени.
10 Разработать программу, в которой ведущий процесс запускает несколько ведомых, реализующих различные задачи и одновременно считающие время своей работы. После закрытия ведущих процессов ведомый собирает и запоминает информацию о времени работы ведомых процессов.

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

Видео выполнения работы

Ход выполнения лабораторной работы

Один процесс отображает данные в область разделяемых данных. Другой процесс их читает и изменяет. После, процесс, который отобразил данные, считывает эти же данные в измененном состоянии.

Действия в первом процессе:

  1. Создать дескриптор на файл с помощью метода CreateFile;
  2. Получить размер файла с помощью функции GetFileSize, используя дескриптор полученный на 1 шаге;
  3. Создать файловое отображение файла с помощью функции CreateFileMapping и сохранить на него дескриптор (на файловое отображение), используя дескриптор на файл;
  4. Запустить новый процесс с помощью функции CreateProcess;
  5. Теперь из первого процесса следует подождать завершение работы порожденного процесса, чтобы считать видоизмененные данные.

Действия во втором процессе

  1. Открыть объект отображения файла в памяти с помощью функции OpenFileMapping;
  2. Получить отображение с помощью функции MapViewOfFile по дескриптору, который был получен на предыдущем шаге;
  3. Скопировать данные из отображения во временный массив с помощью CopyMemory;
  4. Изменить временный массив, как пример, отсортировать данные в массиве;
  5. Скопировать данные из временного массива обратно в отображение с помощью функции CopyMemory.

Действия в первом процессе

  1. Получить обновленные данные из файлового отображения и занести их в файл;
  2. Закрыть все открытые дескрипторы.
Предыдущий раздел Оглавление Следующий раздел