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

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

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


person mooware    schedule 06.06.2011    source источник


Ответы (1)


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

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

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

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

person Bukes    schedule 06.06.2011