#windows #shared-memory #memory-mapped-files
#Windows #общая память #файлы с отображением в памяти
Вопрос:
Когда я создаю сегмент общей памяти в Windows (например CreateFileMapping(INVALID_HANDLE_VALUE, ...)
), есть ли какой-либо способ изменить его размер, кроме создания большего сегмента и копирования данных?
Я читал в MSDN, что сопоставления файлов имеют фиксированный размер, но, возможно, есть какой-то способ создать новое сопоставление в той же памяти? Как в Linux, где вы можете использовать shm_open()
, а затем ftruncate()
и mmap()
это снова.
Ответ №1:
Короткий ответ «нет» — вы не можете изменить размер сопоставления файлов после его создания. Описанная вами последовательность создания / копирования — единственный известный мне способ добиться этого с помощью сопоставлений файлов, поддерживаемых системным файлом подкачки.
Тем не менее, вы можете самостоятельно управлять файлом, поддерживающим ваше отображение, и выполнять это. Начните с вашего собственного файла данных с нулевой инициализацией и укажите допустимые дескрипторы для него при вызовах на CreateFileMapping()
.
Когда вам нужно изменить размер, закройте свои сопоставления, расширьте файл и заново создайте свои сопоставления. Для этого потребуется некоторая синхронизация между операциями увеличения / усечения — нетривиально, но и не должно быть слишком сложно.
В конце концов, это все та же старая история. Добавлено соотношение сложности и производительности.