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
85
プロセスの生成 コピーオンライトを使ったfork編
以下動画のテキストです。
https://youtu.be/Vf98YqydrWw
Satoru Takeuchi
PRO
December 29, 2024
Tweet
Share
More Decks by Satoru Takeuchi
See All by Satoru Takeuchi
「Linux」という言葉が指すもの
sat
PRO
4
140
APIとABIの違い
sat
PRO
5
62
ファイルシステムへのアクセス方法
sat
PRO
0
26
ファイルシステム
sat
PRO
1
34
低レイヤソフトウェア技術者が YouTuberとして食っていこうとした話
sat
PRO
7
6.1k
ポーリングと割り込み
sat
PRO
1
81
Rook: Intro and Deep Dive With Ceph
sat
PRO
1
140
会社員しながら本を書いてきた知見の共有
sat
PRO
3
880
デバイスにアクセスするデバイスファイル
sat
PRO
1
63
Other Decks in Technology
See All in Technology
roppongirb_20250911
igaiga
1
240
Aurora DSQLはサーバーレスアーキテクチャの常識を変えるのか
iwatatomoya
1
1.1k
5分でカオスエンジニアリングを分かった気になろう
pandayumi
0
250
LLM時代のパフォーマンスチューニング:MongoDB運用で試したコンテキスト活用の工夫
ishikawa_pro
0
150
テストを軸にした生き残り術
kworkdev
PRO
0
210
企業の生成AIガバナンスにおけるエージェントとセキュリティ
lycorptech_jp
PRO
2
190
DroidKaigi 2025 Androidエンジニアとしてのキャリア
mhidaka
2
370
研究開発と製品開発、両利きのロボティクス
youtalk
1
530
COVESA VSSによる車両データモデルの標準化とAWS IoT FleetWiseの活用
osawa
1
320
Android Audio: Beyond Winning On It
atsushieno
0
2.1k
なぜテストマネージャの視点が 必要なのか? 〜 一歩先へ進むために 〜
moritamasami
0
230
共有と分離 - Compose Multiplatform "本番導入" の設計指針
error96num
2
980
Featured
See All Featured
Facilitating Awesome Meetings
lara
55
6.5k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Optimising Largest Contentful Paint
csswizardry
37
3.4k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.7k
Imperfection Machines: The Place of Print at Facebook
scottboms
268
13k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.6k
Automating Front-end Workflow
addyosmani
1370
200k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
9
810
The World Runs on Bad Software
bkeepers
PRO
70
11k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.5k
Fireside Chat
paigeccino
39
3.6k
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