11

私は大きなバッファを持っています:

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

新しいプロセスをフォークした場合、どちらかが書き込むまで、親のbufとメモリを共有するbufがあります。それでも、カーネルが割り当てる必要があるのは1つの新しい4KiBブロックだけで、残りは引き続き共有されます。

bufのコピーを作成したいのですが、コピーを少し変更するだけです。フォークせずにコピーオンライト動作をしたいのですが。(フォークするときに無料で入手できるように。)

これは可能ですか?

4

1 に答える 1

11

ディスク上にファイルを作成するかshm_open、ブロックのPOSIX共有メモリセグメント()を作成する必要があります。初めて、それをでマップしMAP_SHAREDます。コピーを作成してCOWに切り替える準備ができたら、をmmapもう一度呼び出してMAP_FIXEDMAP_PRIVATE元のマップの上にマップし、でMAP_PRIVATE2番目のコピーを作成します。これにより、必要な効果が得られるはずです。

于 2012-06-12T15:18:17.713 に答える