Даты консультаций

5 декабря 2016 19:00-20:00

19 декабря 2016 19:00-20:00

Задание

Разобраться в основных средствах межпроцессного взаимодействия (shared memory, memory-mapped file, message queue, semaphore) в выбранном вами инструментальном средстве. В отчёте описать, в том числе, особенности используемой вами реализации.

Запустить два процесса.

Первый должен:

  1. Получать от пользователя имена файлов изображений.
  2. Отображать файлы изображений в память (технология memory-mapped file).
  3. Отправлять процессу 2 команду со служебной информацией (в том числе об отображении) через сообщения (например, message queue).
  4. Получать от процесса 2 через сообщения (MQ) информацию о прогрессе внутри изображения и о завершении обработки всего изображения, отображать её пользователю.
  5. Получать от процесса 2 через сообщения информацию об общей памяти (shared memory) для получения данных и получать через память (ShMem) обработанные изображения.
  6. Выдавать результаты пользователю.

Второй должен:

  1. В потоке main:
    1. Получает от процесса 1 сообщения (MQ) с командами на обработку.
    2. Читает входные данные из MMF от процесса 1.
    3. Для каждого запроса запускает рабочий поток на обработку (большие копирования данных здесь, мне кажется, не нужны; также см. статьи по структурам данных на стр. Неоднородная параллелизация).
      Примечание: запускать не более 4 рабочих потоков одновременно, остальные приходящие запросы ставить в очередь.
  2. i-ый рабочий поток:
    1. Сглаживает изображение маской Гаусса (см. проект-заготовку ниже).
    2. Отправляет процессу 1 сообщения (MQ) о прогрессе внутри изображения и об окончании обработки.
    3. Организует передачу процессу 1 обработанного изображения через общую память (ShMem). Служебную информацию передавать сообщениями (MQ). Синхронизироваться с процессом 1 с помощью семафоров.

При необходимости синхронизации между процессами используйте семафоры.

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

В процессе 1 не закладывайтесь на то, что процесс 2 по заданию обрабатывает не более 4 картинок одновременно. В общем случае число может быть любым, должна быть возможность легко его поменять в процессе 2.

Поскольку процесс 1 передаёт изображение напрямую из файла, можно выбрать любой удобный формат файла изображения (или библиотеку, способную вычитывать форматы из памяти, не по имени файла; вообще Qt это умеет, как я помню).

Заготовка:  img.zip

 

  • Нет меток