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