11

我有一个大缓冲区:

char *buf = malloc(1000000000); // 1GB

如果我派生了一个新进程,它将有一个与父进程共享内存的 buf,直到其中一个或另一个写入它。即使这样,内核也只需要分配一个新的 4KiB 块,其余的将继续共享。

我想制作一个 buf 的副本,但我只会更改一点副本。我想要不分叉的写时复制行为。(就像你在分叉时免费获得一样。)

这可能吗?

4

1 回答 1

11

您需要在磁盘上创建一个文件或shm_open为该块创建一个 POSIX 共享内存段 ( )。第一次,将其映射为MAP_SHARED. 当您准备好制作副本并切换到 COW 时,mmap再次调用MAP_FIXEDMAP_PRIVATE以在您的原始地图之上进行映射,然后MAP_PRIVATE制作第二份副本。这应该会给你你想要的效果。

于 2012-06-12T15:18:17.713 回答