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
35
プロセスの生成 コピーオンライトを使った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
6
90
シェルのジョブ
sat
PRO
1
21
常駐サービスを実現するデーモンプロセス
sat
PRO
0
24
絶対殺すSIGKILLシグナルと絶対死なないプロセス
sat
PRO
3
88
シェルのセッション
sat
PRO
2
31
RubyでKubernetesプログラミング
sat
PRO
4
180
プロセスの生成 exec編
sat
PRO
1
43
プロセスの生成 fork&exec編
sat
PRO
0
37
プロセスの生成 fork編
sat
PRO
0
38
Other Decks in Technology
See All in Technology
AWSアカウントのセキュリティ自動化、どこまで進める? 最適な設計と実践ポイント
yuobayashi
7
1.2k
ABWG2024採択者が語るエンジニアとしての自分自身の見つけ方〜発信して、つながって、世界を広げていく〜
maimyyym
1
210
【内製開発Summit 2025】イオンスマートテクノロジーの内製化組織の作り方/In-house-development-summit-AST
aeonpeople
2
1.1k
サバイバルモード下でのエンジニアリングマネジメント
konifar
21
6.8k
データモデルYANGの処理系を再発明した話
tjmtrhs
0
250
IAMのマニアックな話2025
nrinetcom
PRO
6
1.4k
JavaにおけるNull非許容性
skrb
2
2.7k
サイト信頼性エンジニアリングとAmazon Web Services / SRE and AWS
ymotongpoo
7
1.8k
AIエージェント開発のノウハウと課題
pharma_x_tech
8
4.7k
クラウド関連のインシデントケースを収集して見えてきたもの
lhazy
9
1.9k
アジャイルな開発チームでテスト戦略の話は誰がする? / Who Talks About Test Strategy?
ak1210
1
810
Ruby on Railsで持続可能な開発を行うために取り組んでいること
am1157154
3
160
Featured
See All Featured
Designing on Purpose - Digital PM Summit 2013
jponch
117
7.1k
Gamification - CAS2011
davidbonilla
80
5.2k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
10
530
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
115
51k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.2k
RailsConf 2023
tenderlove
29
1k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Build The Right Thing And Hit Your Dates
maggiecrowley
34
2.5k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
27
1.9k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.2k
Scaling GitHub
holman
459
140k
Building Your Own Lightsaber
phodgson
104
6.2k
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