親が別のプロセスといくつかのページを共有している場合、親をフォークします。私が知っていることから、子はページ テーブルをコピーし、ページを読み取り専用に設定してコピー オン ライトを実行します。しかし、共有メモリ ページに書き込みを行うと、共有メモリ ページのコピーが作成されますが、これは誤りです。Linuxカーネルはこれをどのように回避しますか?
1055 次
1 に答える
6
カーネルは、共有メモリ操作を使用して割り当てられたメモリページを認識しています。子がフォークされると、それらのページはコピーオンライトのマークが付けられないため、すべてのプロセス間で共有されたままになります。
これは、メンバーの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を検索してください。
于 2012-11-15T20:45:23.563 に答える