Windows: изменение размера общей памяти

#windows #shared-memory #memory-mapped-files

#Windows #общая память #файлы с отображением в памяти

Вопрос:

Когда я создаю сегмент общей памяти в Windows (например CreateFileMapping(INVALID_HANDLE_VALUE, ...) ), есть ли какой-либо способ изменить его размер, кроме создания большего сегмента и копирования данных?

Я читал в MSDN, что сопоставления файлов имеют фиксированный размер, но, возможно, есть какой-то способ создать новое сопоставление в той же памяти? Как в Linux, где вы можете использовать shm_open() , а затем ftruncate() и mmap() это снова.

Ответ №1:

Короткий ответ «нет» — вы не можете изменить размер сопоставления файлов после его создания. Описанная вами последовательность создания / копирования — единственный известный мне способ добиться этого с помощью сопоставлений файлов, поддерживаемых системным файлом подкачки.

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

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

В конце концов, это все та же старая история. Добавлено соотношение сложности и производительности.