我有一个大缓冲区:
char *buf = malloc(1000000000); // 1GB
如果我 fork 一个新进程,它将有一个 buf,它与父进程的 buf 共享内存,直到一个或另一个写入它。即使那样,内核也只需要分配一个新的 4KiB block ,其余的将继续共享。
我想制作一个 buf 的副本,但我只打算更改副本的一点点。我想要不 fork 的写时复制行为。 (就像你在 fork 时免费获得一样。)
这可能吗?
最佳答案
您需要在磁盘上创建文件或为 block 创建 POSIX 共享内存段 (shm_open
)。第一次,用 MAP_SHARED
映射它。当您准备好复制并切换到 COW 时,使用 MAP_FIXED
和 MAP_PRIVATE
再次调用 mmap
以在原始 map 之上进行映射,并使用 MAP_PRIVATE
制作第二个副本。这应该能让您获得想要的效果。
关于c - 在没有 fork() 的情况下获取 fork()ing 的写时复制行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10998943/