Intereting Posts
Каким будет наиболее эффективный способ найти = i в отсортированном массиве? хранить известные пары ключ / значение в c Что такое аргумент «char-sequence» для функций генерации NaN? Могут ли компиляторы давать предупреждения при использовании неинициализированных значений? Как попасть в режим C99 в Codeblocks10.05? Пока scanf! = EOF или scanf == 1? Размер массива с константной переменной в C Если волатильность бесполезна для streamовой передачи, почему атомарные операции требуют указателей на изменчивые данные? Как различать трубку и интерактивный stdin Является ли «истинный» результат из>, <,!, &&, || или == определено? Получите всю информацию DIMM от IPMI с помощью API FreeIPMI как преобразовать значение байта в int в объекте-c как запустить java-программу из программы ac? Проверьте, присутствуют ли все значения char в строке Преобразование строки в строку кода в C

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

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

Теперь мне нужно сделать произвольное изменение размера буферов. А также munmap буферы и снова использовать свободное пространство позже.

Единственное решение, которое я могу решить для первой проблемы, это: ftuncate (file_size + old_buffer_size + extra_size), mmap, скопировать данные в новый буфер и затем munmap исходные данные. Это выглядит очень дорого для меня, и, вероятно, лучший способ. Это также влечет за собой удаление исходного буфера каждый раз.

Для второй проблемы у меня даже нет плохого решения, я явно не могу перемещать память каждый раз, когда удаляется буфер. И если я буду следить за свободной памятью и использовать ее по возможности, это замедлит процесс распределения, а также оставит меня с битами и кусками между ними, которые не используются.

Надеюсь, это не слишком смущает. Спасибо

Насколько я понимаю, вам нужно увеличить (или уменьшить) существующее сопоставление памяти. Под Linux-памятью, реализованной в виде файла, находится в файловой системе / dev / shm. Все операции в этом файле такие же, как и в обычных файлах (и дескрипторах файлов).

если вы хотите увеличить существующее сопоставление, сначала разверните размер файла с помощью ftruncate (как вы писали), затем используйте mremap чтобы развернуть сопоставление с запрошенным размером.

Если вы храните указатели в этом регионе, возможно, вам придется их обновить, но сначала попробуйте позвонить с флагом 0. В этом случае система пытается увеличить существующее сопоставление с запрошенным размером (если нет столкновения с другой сохраненной областью памяти), и указатели остаются в силе.

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

Сокращение – это то же, что и в обратном порядке.

Для этой цели я написал библиотеку с открытым исходным кодом: rszshm – изменяемая по размеру разделяемая память с указателем

Процитировать на странице описания:

Чтобы resize, rszshm сначала отображает большую, закрытую, нозервную карту. Это служит для запроса диапазона адресов. Совместное сопоставление файлов затем накладывает начало диапазона. Более поздние вызовы для расширения отображения перекрывают больше пролета. Попытки выйти за пределы диапазона возвращают ошибку.

Я расширяю отображение, вызывая mmap с MAP_FIXED по исходному адресу и с новым размером.