1. ホーム
  2. linux

[解決済み] 共有メモリページとフォーク

2022-02-04 02:01:32

質問

親プロセスが他のプロセスといくつかのページを共有しており、親プロセスをフォークした場合。私が知っている限りでは、子はページテーブルをコピーし、私たちはページを読み取り専用に設定し、Copy-On-Writeを実行します。しかし、これでは、書き込みを行うと共有メモリページのコピーが作成されてしまい、これは間違っています。Linuxカーネルはどのようにこれを回避しているのでしょうか?

解決方法は?

カーネルは、どのメモリページが共有メモリ操作で割り当てられたかを知っています。子プロセスがフォークされたとき、それらのページは Copy-on-Write とマークされないので、すべてのプロセス間で共有されたままとなります。

このことは vm_area_struct データ構造で vm_flags メンバになります。フラグの1つは VM_SHARED . mm/memory.c には、ページを COW に変換すべきかどうかを判断する次のような関数があります。

static inline int is_cow_mapping(vm_flags_t flags)
{
        return (flags & (VM_SHARED | VM_MAYWRITE)) == VM_MAYWRITE;
}

このフラグがどのように設定され、使用されるかについて詳しく知りたい場合は、次のサイトにアクセスしてください。 Linuxクロスリファレンス で、VM_SHARED を検索してください。