#c #c #linux #posix #shared-memory
#c #c #linux #posix #разделяемая память
Вопрос:
У меня есть класс, который открывает общую память posix с помощью shm_open. Теперь мне приходится создавать объекты этого класса несколько раз (всего 5-10 объектов), и это означает, что одна и та же разделяемая память будет открыта столько раз.
Общая память имеет переменный размер и может составлять от 1 до 500 кб.
Вопросы, касающиеся этого:
1. Приведет ли это к увеличению использования памяти? (Я не вижу, чтобы это происходило, поэтому я предполагаю, что нет)
2. Приведет ли это к плохой производительности при доступе к общей памяти?
3. Что-нибудь еще, что может пойти не так?
Ответ №1:
Ответ находится на странице, на которую вы связали shm_open:
shm_open() создает и открывает новый или существующий объект разделяемой памяти POSIX. Объект разделяемой памяти POSIX фактически является дескриптором, который может использоваться несвязанными процессами для mmap (2) той же области разделяемой памяти.
Чтобы получить доступ к объекту общей памяти, вам нужен его дескриптор. shm_open () может использоваться как для открытия (создания) нового, так и для повторного открытия существующего объекта общей памяти. При повторном открытии существующего объекта не происходит увеличения объема памяти или ухудшения производительности.
Ответ №2:
Это не увеличит использование памяти, однако вы используете дескрипторы каждый раз, когда открываете общую память, и у вас может закончиться. (У каждого процесса есть ограничение на количество открытых дескрипторов.)
Вам необходимо управлять доступом к общей памяти, возможно, используя объекты синхронизации, такие как семафоры.
Mmap каждый раз сопоставляется с другим базовым адресом, поэтому хранение указателей, указывающих на общую память, является плохой идеей.
Комментарии:
1. Я очень далек от достижения предела количества дескрипторов. Что касается двух других проблем — ну, с ними очень легко справиться на c путем инициализации в конструкторе и правильной деинициализации в деструкторе.
2. Если вы получаете доступ к общей памяти из разных процессов, я не понимаю, как вы можете решить проблемы синхронизации в конструкторе и деструкторе. Вам нужно контролировать доступ с помощью мьютекса каждый раз, когда вы читаете и записываете в общую память. Что касается последней проблемы, как я также не понимаю, как это можно смягчить с помощью конструктора / деструктора. Необходима некоторая форма относительной адресации.
3. ops Я имел в виду это для последней проблемы (относительно отображения этой области). Для решения проблемы синхронизации я использую очереди сообщений, чтобы сообщить процессу, когда была записана общая память — только тогда этот процесс считывает эту область памяти.