gpt4 book ai didi

c++ - 如何在 Windows 上预留内存并将以后的映射文件放入其中?

转载 作者:可可西里 更新时间:2023-11-01 09:57:54 32 4
gpt4 key购买 nike

我想保留一个内存区域,然后将映射文件连续地放入保留的内存中。映射文件之间可能存在较大的时间间隔,在此期间其他函数可能会从堆中分配内存。映射后,文件可能无法取消映射并映射到新的内存位置。

在 Linux 上会是这样的:

#include <iostream>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
#include <cerrno>

int main(){
void *memory = mmap(nullptr, getpagesize() * 2,
PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_NORESERVE, -1, 0); // reserve memory
int handle1 = ::open("1", O_CREAT | O_RDWR, S_IRWXU); // open file1
int handle2 = ::open("2", O_CREAT | O_RDWR, S_IRWXU); // open file2
void *data = mmap(memory, getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED |MAP_FIXED, handle1, 0); // map first file into reserved memory
void *data2 = mmap(static_cast<char *>(memory) + getpagesize(), getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, handle2, 0); // map second file into reserved memory
}

但是在 Windows 上我似乎无法找到执行此操作的正确方法。有谁知道这是怎么做到的?

编辑:由于我的目标似乎并不那么容易理解。再次简化:

我想要内存映射的内存。一旦映射内存中充满了数据,我想在已经映射的内存之后直接将一个新文件映射到内存中以扩展映射内存(不在两个内存映射区域之间留下间隙)。

在稍后的程序启动时,这些文件可用于恢复先前运行的所有数据。

解决稀疏文件和扩展现有文件的问题:程序应该能够删除不再需要的文件。因此,映射始终是新文件很重要。

您可能更多地将其视为分配器。需要内存映射内存。该库映射一个内存块并返回一个指向子 block 的指针。不再需要内存,它返回给分配器。如果不再需要整个映射,则删除关联的文件(如果不再需要,则不需要通过映射写入数据)。

最佳答案

当你在文件中映射时,你真的不需要保留它,你只需要知道你可以在某个地方连续映射两个文件。例如,您的 Linux 示例代码是单线程的,如果您在映射到文件之前立即取消映射保留区域,也可以正常工作。

在 Windows 上,处理可能的多线程竞争条件,你可以这样做:

 while(1) {
char *memory = VirtualAlloc(NULL, page_size * 2, MEM_RESERVE, 0);
VirtualFree(memory);
if (MapViewOfFileEx(handle1, FILE_MAP_WRITE, 0, 0, page_size, memory) == NULL
&& GetLastError() == ERROR_INVALID_ADDRESS) {
continue;
}
if (MapViewOfFileEx(handle2, FILE_MAP_WRITE, 0, 0, page_size, memory + page_size) == NULL
&& GetLastError() == ERROR_INVALID_ADDRESS) {
UnMapViewOfFile(memory);
continue;
}
break;
}

关于c++ - 如何在 Windows 上预留内存并将以后的映射文件放入其中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41079506/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com