我有一个大缓冲区:
char *buf = malloc(1000000000); // 1GB
如果我分叉一个新进程,它将有一个buf,它与父进程的buf共享内存,直到一个或另一个写入它。即使这样,内核也只需要分配一个新的4KiB块,其余的将继续被共享。
我想复制一下buf,但我只想改变一点副本。我想要不写分支的写时复制行为。 (就像你在分叉时免费获得的那样。)
这可能吗?
答案 0 :(得分:9)
您需要在磁盘或块的POSIX共享内存段(shm_open
)上创建文件。第一次,用MAP_SHARED
映射它。当您准备好制作副本并切换到COW时,请使用mmap
和MAP_FIXED
再次致电MAP_PRIVATE
以覆盖原始地图的顶部,并使用MAP_PRIVATE
制作第二份副本。这应该可以获得你想要的效果。