我有一个大缓冲区:
char *buf = malloc(1000000000); // 1GB
如果我分叉了一个新进程,它会有一个缓冲区与父进程的缓冲区共享内存,直到其中一个写入为止。即使如此,内核只需要分配一个新的4KiB块,其余部分仍将继续共享。我想复制buf,但我只会改变复制品的一点点内容。我想要写时复制的行为而不用分叉。(就像你在fork时免费获得的一样。)
这可能吗?
我有一个大缓冲区:
char *buf = malloc(1000000000); // 1GB
如果我分叉了一个新进程,它会有一个缓冲区与父进程的缓冲区共享内存,直到其中一个写入为止。即使如此,内核只需要分配一个新的4KiB块,其余部分仍将继续共享。你需要在磁盘上创建一个文件或者POSIX共享内存段(shm_open
)作为这个块的载体。第一次映射时,使用MAP_SHARED
。当你准备好复制并切换到COW模式时,再次调用mmap
,并使用MAP_FIXED
和MAP_PRIVATE
来覆盖原始映射,并使用MAP_PRIVATE
来创建第二个副本。这样可以获得所需的效果。
ftruncate
来给共享内存段设置大小。初始大小为零。 - R.. GitHub STOP HELPING ICE\n
结尾。 - R.. GitHub STOP HELPING ICE