LINUX.ORG.RU

IPC


0

0

Имеется некоторое приложение, которое получает бинарные данные из некого потока информации (пусть это будет FIFO-файл). Хочется, чтобы несколько других приложений могли обрабатывать эти данные в реальном времени. Для этого реализована схема с двойной буферизацией: в каждый момент времени в одном из буферов находятся все обработчики, а в другой в это время происходит запись. Синхронизация основана на двух семафорах. Проблема состоит в следующем: обработчик информации может захватить семафор и заблокироваться на неопределенный момент времени во время чтения. Из-за этого обработчики сразу же делают memcpy() всего буфера в локальную память и отпускают блокировку. В случае если они задерживаются, то происходит восстановление из архива, требующее I/O. Возможно имеется какая-то известная схема решения этой проблемы?


Ну это слишком общее описание. Сомневаюсь что кто-то даст нормальный ответ на такой вопрос.

- Обработчики одновременно модифицируют бинарные данные?

- А делать уникальную копию данных для каждого обработчика можно?

- Что подразумевается под «обрабатывать эти данные в реальном времени»?

pathfinder ★★★★ ()

А нельзя ли организовать что-то вроде схемы Издатель/Подписчик. Одно приложение издатель создает unix socket (или tcp socket) сервер и будет принимать соединения от обработчиков-подписчиков. Это приложение-издатель будет считывать данные из источника и рассылать всем подписчикам.

Если делать однопотоковый сервер на базе poll/select то можно не заморачиваться с семафорами и другими примитивами синхронизации.

pathfinder ★★★★ ()

Расскажи задачу в целом, уж больно всё странно.

true_admin ★★★★★ ()
Ответ на: комментарий от pathfinder

Прошу прощения, перечитал и понял, что, действительно, написано не очень... Обработчики — это приложения-клиенты, которые должны читать информацию от демона-поставщика. Используемые средства IPC: это POSIX shared memory (shmget, shmat..) и два семафора, один для каждого буфера. Клиенты не модифицируют получаемую информацию в буферах, но их выполнение не должно влиять на поставщика (если клиент заблокируется - поставщик должен продолжать работать). Задача типа «один писатель/много читателей». Если требуется еще какая-то информация — сообщу.

cs ()
Ответ на: комментарий от cs

Делай лучше по схеме Издатель/Подписчик. ИМХО самый лучший вариант, когда клиенты не замечают существования друг друга и нет гемора с синхронизацией (семафоры и т.д.).

Если информацию для клиентов можно потерять (в случае их зависания), либо поток информации с первоисточника можно временно приостановить, то задача в общем случае даже будет РЕШАЕМА.

pathfinder ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.