Страница 1 из 1

Способ межпроцессного взаимодействия?

Добавлено: 25.07.21 18:26
БудДен
Итак, нужно сделать, чтобы можно было из КуМира вызывать не только команды, но и отдельные процедуры. Скажем, выделить математический массив (вызов процедуры) и написать какое-нибудь перемножение матриц (множество операций, требующих вызова из КуМира в ЯОС).

Какой способ межпроцессного взаимодействия предпочесть?

https://github.com/goldsborough/ipc-bench Linux - самое быстрое - это shared memory и memory mapped files - 1.6 млн сообщ/сек (хотя надо проверять, ведь нужны синхронные вызовы, кто знает, как у них там в тесте). Но и сокеты - 130 тыс/сек. Во всяком случае, тест можно допилить до синхронного.

А что в Windows?


https://gamedev.ru/flame/forum/?id=169089

https://stackoverflow.com/a/7743060/9469533 - предлагают сообщение Copy_data

Re: Способ межпроцессного взаимодействия?

Добавлено: 26.07.21 00:05
БудДен
Что-то я побоялся сообщения, посему сделал тест передачи на разделяемой памяти, синхронизация двумя семафорами. Получается порядка 40тыс вызовов в секунду, миллион вызовов выполняется 24 секунды. При том, сам Кумир в быстром режиме выполнят вот такую программу за 4 секунды:

Код: Выделить всё

алг
нач
цел а, б
б := 0;
нц для а от 0 до 1000000
б := а - б
кц
вывод б
кон
Т.е. замедление примерно в 10 раз по сравнению с КуМиром. Для начала можно было бы и смириться, но уже какой-то спортивный интерес стал возникать. Например, нельзя ли сделать семафоры на спинлоках, а сами спинлоки хранить в той же общей памяти?

Re: Способ межпроцессного взаимодействия?

Добавлено: 26.07.21 02:02
БудДен
Сделал семафоры на спинлоках в той же разделяемой памяти, что и сами данные, теперь получается порядка 2 секунд на всё, т.е. 500тыс вызовов в секунду. Вроде соответствует по порядку величины данным для линукса. В этой ситуации замедление на саму передачу данных несущественное и, если не будет других замедлений, то скорость вызова ЯОС из КуМира будет сопоставима со скоростью работы самого КуМира. Но замедления, конечно же, будут, т.к. нужно ещё преобразовать вызовы, привести типы данных и т.п.