Синхронизация очереди сообщений между процессами - PullRequest
3 голосов
/ 21 ноября 2011

Я пытаюсь реализовать программу, в которой есть продюсер и N (N> = 1) работников.Они общаются, используя очередь сообщений.По идее, продюсер отправляет в очередь «задания».Рабочие выполняют вызов msgrcv (), чтобы получить задачу и выполнить некоторый код.После того, как работник выполнит задачу, он отправит в очередь результат вычисления.Производитель получит это сообщение и сохранит результаты.

Я использую очереди сообщений POSIX, а производитель и рабочие работают одновременно.

Проблема этой программы заключается в том, что существует сценарий, которыйставит под угрозу общение.Каждое сообщение имеет размер ~ 5000 байт.Максимальный размер очереди составляет ~ 16000 байт в системах UNIX, что имеет место.

Сценарий: в очереди 3 задачи (5000 * 3 = 15000 байт).Некоторые работники получают одно сообщение из очереди (теперь очередь имеет 10000 байт).Рабочий начинает выполнение задачи, и из-за количества байтов, которое рабочий должен обработать в каждой задаче, производитель отправляет в очередь другое сообщение (очередь теперь заполнена).Теперь, после выполнения задачи, работник пытается отправить результат в очередь и блокируется (очередь заполнена).Производитель пытается отправить еще одно задание в очередь и тоже блокируется.

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

Есть ли у кого-нибудь идеи?чтобы избежать этой ситуации?

Ответы [ 2 ]

1 голос
/ 21 ноября 2011

Если вы не можете изменить размер очереди, количество используемых очередей или использовать другой API очередей, то как насчет очередей с меньшим количеством данных?

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

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

0 голосов
/ 21 ноября 2011

Я бы либо использовал вторую очередь сообщений для клиента -> ответов сервера, либо ограничил (#sent - #received) безопасным числом.

...