LINUX.ORG.RU

вопрос про shared memory


0

1

Добрый день! Очень прошу помочь решить вопрос !

Есть два приложения, написанные на С++/Qt. Приложение №1 обрабатывает данные, а №2 занимается визуализацией и gui.

Обмен данными между процессами реализован при помощи shared memory (QSharedMemory). Таким образом, в процессе №2, создаются 800 раз по 4000 байт сегменты shared memory,а в процессе №1 идет просто подсоединение.

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

Еще я убрал ограничение на количество системных семафоров :

в файле /etc/sysctl.conf прописал kernel.sem = 250 32000 32 2000, т.о. стало 2000 семафоров.

Без этого пункта процесс №2 не мог создать выше 122 сегментов shared memory.

Теперь проблема: когда два процесса поработают минуты три, процесс №2 виснет намертво. А если убрать процедуры lock/unlock у shared memory, то загрузка процессора процессом №2 подскакивает в 2 раза, и составляет 50 процентов, при стандартных 24-25 %.

??


Таким образом, в процессе №2, создаются 800 раз по 4000 байт сегменты shared memory,а в процессе №1 идет просто подсоединение.

одним куском почему не сделал? Ну страдай теперь...

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

ну страдай теперь. Тебе удобнее, а вот твоему процессору — увы, нет.

AFAIK 800 файлов открыть было-бы быстрее и проще...

emulek
()

Не понимаю людей, гоняющих шареную память в Qt. Я бы сделал пайп или обмен данными через сеть. Обычно это проще и практичнее.

А так по симптомам без исходника понять практически нереально.

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

я тебе по теме и отвечаю: так никто не делает. Ты пытаешься одеть трусы через голову, ибо ботинки сложно и неудобно расшнуровывать(что-бы снять штаны), а кепку ты уже снял.

emulek
()

А если убрать процедуры lock/unlock у shared memory

Ищи deadlock, где-то он у тебя случается.

one_more_hokum ★★★
()

процесс №2 виснет намертво

Используй strace и gdb, Люк

true_admin ★★★★★
()

Добавь третье звено, либу, которая будет отвечать за распределение ресурсов и доступ к ним.

Dron ★★★★★
()

Еще я убрал ограничение на количество системных семафоров

Если для тебя не важна кроссплатформенность, то уж лучше использовать dbus.

no-such-file ★★★★★
()
Ответ на: комментарий от staseg

Я бы еще посоветовал к этому всему zeromq для удобного обмена сообщениями.

ЕМНИП, у них так же было что-то для обмена через шаред-мемори. Или я туплю?

trex6 ★★★★★
()

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

Эпический изврат. Очевидный дедушка Лок, кмк.

nanoolinux ★★★★
()
Последнее исправление: nanoolinux (всего исправлений: 1)
Ответ на: комментарий от nanoolinux

а как тогда забирать : в while(1) цикле ? или по таймеру? или же есть механизм уведомлений?

ps. создал всего один сегмент размером 2 байта, такая же ситуация, после нескольких минут работы загрузка cpu повышается в 2 раза

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

а как тогда забирать

Не знаю. Если ты хочешь синхронизировать доступ к памяти - используй мутекс. Семафор - это просто счётчик.

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