Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
プロセスの生成 コピーオンライトを使ったfork編
Search
Satoru Takeuchi
PRO
December 29, 2024
Technology
0
76
プロセスの生成 コピーオンライトを使ったfork編
以下動画のテキストです。
https://youtu.be/Vf98YqydrWw
Satoru Takeuchi
PRO
December 29, 2024
Tweet
Share
More Decks by Satoru Takeuchi
See All by Satoru Takeuchi
低レイヤソフトウェア技術者が YouTuberとして食っていこうとした話
sat
PRO
7
6k
ポーリングと割り込み
sat
PRO
1
67
Rook: Intro and Deep Dive With Ceph
sat
PRO
1
130
会社員しながら本を書いてきた知見の共有
sat
PRO
3
840
デバイスにアクセスするデバイスファイル
sat
PRO
1
56
ファイルシステムのデータを ブロックデバイスへの操作で変更
sat
PRO
1
45
デバイスドライバ
sat
PRO
0
72
マルチスレッドの実現方法 ~カーネルスレッドとユーザスレッド~
sat
PRO
2
160
共有メモリ
sat
PRO
3
86
Other Decks in Technology
See All in Technology
【新卒研修資料】数理最適化 / Mathematical Optimization
brainpadpr
25
11k
LLMで構造化出力の成功率をグンと上げる方法
keisuketakiguchi
0
230
【CEDEC2025】『ウマ娘 プリティーダービー』における映像制作のさらなる高品質化へ!~ 豊富な素材出力と制作フローの改善を実現するツールについて~
cygames
PRO
0
230
みんなのSRE 〜チーム全員でのSRE活動にするための4つの取り組み〜
kakehashi
PRO
2
130
大規模イベントに向けた ABEMA アーキテクチャの遍歴 ~ Platform Strategy 詳細解説 ~
nagapad
0
180
2025-07-31: GitHub Copilot Agent mode at Vibe Coding Cafe (15min)
chomado
2
360
Oracle Cloud Infrastructure:2025年7月度サービス・アップデート
oracle4engineer
PRO
1
110
Kiroでインフラ要件定義~テスト を実施してみた
nagisa53
3
290
AI によるドキュメント処理を加速するためのOCR 結果の永続化と再利用戦略
tomoaki25
0
380
【CEDEC2025】大規模言語モデルを活用したゲーム内会話パートのスクリプト作成支援への取り組み
cygames
PRO
2
770
Nx × AI によるモノレポ活用 〜コードジェネレーター編〜
puku0x
0
330
dipにおけるSRE変革の軌跡
dip_tech
PRO
1
220
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3.1k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
332
22k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
GitHub's CSS Performance
jonrohan
1031
460k
Rails Girls Zürich Keynote
gr2m
95
14k
The World Runs on Bad Software
bkeepers
PRO
70
11k
Statistics for Hackers
jakevdp
799
220k
Typedesign – Prime Four
hannesfritz
42
2.7k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
29
9.6k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3k
Transcript
プロセスの生成 コピーオンライトを使った fork編 Dec. 28th, 2024 Satoru Takeuchi X: satoru_takeuchi
1
はじめに • 過去動画ではfork時に親プロセスのメモリをコピーする単純なモデルで説明してい た • 本動画ではLinuxにおけるforkの実際の挙動を説明する ◦ 実際は仮想記憶の機能を応用してメモリのフルコピーをしていない ◦ そのためforkの実行コストは低い
• 事前に必要な知識 ◦ fork関数についての基礎知識 ◦ 仮想記憶、ページテーブルについての基礎知識 • 関連動画 ◦ Linuxのメモリ管理入門 プロセスごとに違う世界を見せる仮想記憶 ◦ 仮想アドレスから 物理アドレスにはどうやって変換するの ? ◦ プロセスの生成 fork編 2
おさらい: 仮想アドレス空間とページテーブル 3 プロセスAの仮想アドレス 0 200 物理メモリ 0 プロセスAのメモリ 500
600 100 200 300 400 700 仮想アドレス 物理アドレス 0-100 100-200 100-200 200-300 ページサイズ プロセスAのページテーブル (カーネルメモリ上に存在 ) 100 ページテーブルエントリ 物理アドレス
forkの挙動 • これまでの説明 ◦ 親プロセスのメモリを子プロセスにコピー • 実際のもの ◦ 親プロセスと子プロセスのページテーブルだけをコピー ◦
親子プロセスがメモリを共有 4
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のページテーブル コピー
疑問: 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のページテーブル
解決策: コピーオンライト技術を使う • ページテーブルエントリには書き込み可否を決められるフラグがある • 親子プロセスが共有するメモリ(ページ)は書き込み不可にする • メモリへの書き込みが発生した場合は以下のような処理をする 1. 書き込みと同時にページフォールト例外発生
2. ページフォールトハンドラが書き込まれたページをコピー 3. ページテーブルエントリを変更 4. 例外から復帰する • 書き込み時にメモリをコピーするので「Copy-on-Write(CoW)」と呼ばれる 7
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のページテーブル
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のページテーブル 書き込み
当該ページは書き込み不可なのでページフォールト発生 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のページテーブル 書き込み ページフォールト 例外発生
ページフォールトハンドラがメモリをコピー 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のメモリ コピー
ページテーブルエントリを設定 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のメモリ コピー
CoWを使う嬉しさ • forkの所要時間が削減できる • forkによるメモリ使用量の増加が減らせる 13
まとめ • fork()は仮想記憶を応用したコピーオンライト(CoW)技術を使っているため、高速、 かつ、メモリ使用量が少ない • かっこいい 14