LINUX.ORG.RU

Shared memory на практике

 , , , ,


1

1

Необходимо для нескольких программ с похожим функционалом сделать некоторую общую память до 10МБ аля кеш, в котором 2-ая программа может использовать захешированные данные 1-ой программой, добавлять свои данные в кеш и чтоб 1-ая программа также могла их использовать. Если некоторые закешированные данные не используются ни одной программой - они удаляются. Общий функционал вынесен в библиотеку, а теперь вопросы:
1. может ли библиотека сама рулить общей памятью?
2. или нужен процесс-посредник?
3. а может позволить программам самим взаимодействовать с общей памятью? Что с экранированием?



Последнее исправление: zusazo (всего исправлений: 1)

Ответ на: комментарий от four_str_sam

Может есть другой вариант в линуксе для кеширования в оперативной памяти? Или другой способ реализации задачи? Интересует скорость доступа и минимальные задержки.

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

Можно еще попробовать mmap. Но, наверное, разделяемая память будет чуть быстрее.

four_str_sam
()

еще вариант - использовать memcached и не сильно париться с синхронизацией, но тут могут быть накладные расходы большие.

TOXA ★★
()

Для такого взаимодействия, наверное, подойдёт какой-нибудь key-value storage. Вопрос оперативного оповещения о добавлении новых данных можно решить через fifo, например.

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

последний вопрос на примере

Так, есть одиночная мини игра, где для каждого игрока открывается свое окно. Необходимо хранить по 10 фреймов (буфер - массив пикселей) на каждую «модельку» персонажа и спрайт дороги в общей памяти, клиенты подключаются к ней и отрисовывают у себя в окне полученные спрайты. Всего моделек будет 5. Весь общий функционал выносим в библиотеку. У каждого буфера в общей памяти будет булевское значение: используется/не используется. Если буфер никем не используется - он удаляется из общей памяти. Можно реализовать без посредника в виде сервера, переместив управление общей памятью на библиотеку? Может ли она самостоятельно управлять общей памятью или нужно сделать так, чтоб клиент сам непроизвольно следил за очищением общей памяти через библиотеку? Как лучше всё это организовать? В качестве обучения будет использоваться язык rust.
Зачем всё это нужно? Можно и при смене модельки персонажа подключать необходимое с жесткого диска, но это лишняя нагрузка (в данном примере она минимальна, но всё же). Общая память быстра, при окрытии 10+ клиентов и использовании одной и той же модельки персонажа - 1 раз она загружается в общую память и все ее используют, профит очевиден.

zusazo
() автор топика
Ответ на: последний вопрос на примере от zusazo

Зачем всё это нужно? Можно и при смене модельки персонажа подключать необходимое с жесткого диска, но это лишняя нагрузка (в данном примере она минимальна, но всё же). Общая память быстра, при окрытии 10+ клиентов и использовании одной и той же модельки персонажа - 1 раз она загружается в общую память и все ее используют, профит очевиден.

Если всё это делается только для чтения статичных данных с диска, то однозначно надо использовать mmap().

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

MemoryMap является довольно интересной идеей, но не особо понятной. К тому же в расте помечено как устаревшее. Усложним задачу: на диске находятся .svg файлы. Как можно до растрирования клиентом .svg файла нужного разрешения определить, есть ли необходимый уже в mmap? Как я понял, в памяти мы уже работаем не с файлом, а с потоком данных, т.е. перед каждым этим отражением в памяти можно ли повесить некий ключ, определяющий разрешение, с которым .svg был растрирован? Mmap у меня ассоциируется с некоторой линией, где один за другим записаны файлы, для работы с некоторым файлом нам нужно знать начало в памяти и его длину.

zusazo
() автор топика

Я бы сделал процесс-посредник, но хз, опыта у меня в этом мало.

ei-grad ★★★★★
()

Общая память не завязывается на конкретном процессе? Если там хранить важные данные, то после падения процесса можно ведь восстанавить прежнее состояние работы?

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