Upgrade to Pro — share decks privately, control downloads, hide ads and more …

プロセスの生成 コピーオンライトを使ったfork編

プロセスの生成 コピーオンライトを使ったfork編

以下動画のテキストです。
https://youtu.be/Vf98YqydrWw

Satoru Takeuchi

December 29, 2024
Tweet

More Decks by Satoru Takeuchi

Other Decks in Technology

Transcript

  1. はじめに • 過去動画ではfork時に親プロセスのメモリをコピーする単純なモデルで説明してい た • 本動画ではLinuxにおけるforkの実際の挙動を説明する ◦ 実際は仮想記憶の機能を応用してメモリのフルコピーをしていない ◦ そのためforkの実行コストは低い

    • 事前に必要な知識 ◦ fork関数についての基礎知識 ◦ 仮想記憶、ページテーブルについての基礎知識 • 関連動画 ◦ Linuxのメモリ管理入門 プロセスごとに違う世界を見せる仮想記憶 ◦ 仮想アドレスから 物理アドレスにはどうやって変換するの ? ◦ プロセスの生成 fork編 2
  2. おさらい: 仮想アドレス空間とページテーブル 3 プロセスAの仮想アドレス 0 200 物理メモリ 0 プロセスAのメモリ 500

    600 100 200 300 400 700 仮想アドレス 物理アドレス 0-100 100-200 100-200 200-300 ページサイズ プロセスAのページテーブル (カーネルメモリ上に存在 ) 100 ページテーブルエントリ 物理アドレス
  3. fork後のメモリマップ 5 プロセスAの仮想アドレス 0 200 物理メモリ 0 プロセスA,Bのメモリ 500 600

    100 200 300 400 700 仮想アドレス 物理アドレス 0-100 100-200 100-200 200-300 プロセスAのページテーブル 100 物理アドレス 0 200 100 プロセスAからforkした プロセスBの仮想アドレス 仮想アドレス 物理アドレス 0-100 100-200 100-200 200-300 プロセスBのページテーブル コピー
  4. 疑問: fork後にメモリに書き込みができないのでは? 6 プロセスAの仮想アドレス 0 200 物理メモリ 0 プロセスA,Bのメモリ 500

    600 100 200 300 400 700 仮想アドレス 物理アドレス 0-100 100-200 100-200 200-300 プロセスAのページテーブル 100 物理アドレス 0 200 100 プロセスBの仮想アドレス 仮想アドレス 物理アドレス 0-100 100-200 100-200 200-300 プロセスBのページテーブル
  5. fork後のメモリマップ with 書き込み可能ビット 8 プロセスAの仮想アドレス 0 200 物理メモリ 0 プロセスA,Bのメモリ

    500 600 100 200 300 400 700 仮想アドレス 物理アドレス 書き込み可能 0-100 100-200 × 100-200 200-300 × プロセスAのページテーブル 100 物理アドレス 0 200 100 プロセスBの仮想アドレス 仮想アドレス 物理アドレス 書き込み可能 0-100 100-200 × 100-200 200-300 × プロセスBのページテーブル
  6. fork後に書き込み発生 9 プロセスAの仮想アドレス 0 200 物理メモリ 0 プロセスA,Bのメモリ 500 600

    100 200 300 400 700 仮想アドレス 物理アドレス 書き込み可能 0-100 100-200 × 100-200 200-300 × プロセスAのページテーブル 100 物理アドレス 0 200 100 プロセスBの仮想アドレス 仮想アドレス 物理アドレス 書き込み可能 0-100 100-200 × 100-200 200-300 × プロセスBのページテーブル 書き込み
  7. 当該ページは書き込み不可なのでページフォールト発生 10 プロセスAの仮想アドレス 0 200 物理メモリ 0 プロセスA,Bのメモリ 500 600

    100 200 300 400 700 仮想アドレス 物理アドレス 書き込み可能 0-100 100-200 × 100-200 200-300 × プロセスAのページテーブル 100 物理アドレス 0 200 100 プロセスBの仮想アドレス 仮想アドレス 物理アドレス 書き込み可能 0-100 100-200 × 100-200 200-300 × プロセスBのページテーブル 書き込み ページフォールト 例外発生
  8. ページフォールトハンドラがメモリをコピー 11 プロセスAの仮想アドレス 0 200 物理メモリ 0 プロセスAのメモリ 500 600

    100 200 300 400 700 仮想アドレス 物理アドレス 書き込み可能 0-100 100-200 × 100-200 200-300 × プロセスAのページテーブル 100 物理アドレス 0 200 100 プロセスBの仮想アドレス 仮想アドレス 物理アドレス 書き込み可能 0-100 100-200 × 100-200 200-300 × プロセスBのページテーブル 書き込み プロセスA,Bのメモリ プロセスBのメモリ コピー
  9. ページテーブルエントリを設定 12 プロセスAの仮想アドレス 0 200 物理メモリ 0 プロセスAのメモリ 500 600

    100 200 300 400 700 仮想アドレス 物理アドレス 書き込み可能 0-100 100-200 〇 100-200 200-300 × プロセスAのページテーブル 100 物理アドレス 0 200 100 プロセスBの仮想アドレス 仮想アドレス 物理アドレス 書き込み可能 0-100 300-400 〇 100-200 200-300 × プロセスBのページテーブル 書き込み プロセスA,Bのメモリ プロセスBのメモリ コピー