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
60
プロセスの生成 コピーオンライトを使ったfork編
以下動画のテキストです。
https://youtu.be/Vf98YqydrWw
Satoru Takeuchi
PRO
December 29, 2024
Tweet
Share
More Decks by Satoru Takeuchi
See All by Satoru Takeuchi
Rook: Intro and Deep Dive With Ceph
sat
PRO
0
88
会社員しながら本を書いてきた知見の共有
sat
PRO
3
770
デバイスにアクセスするデバイスファイル
sat
PRO
1
32
ファイルシステムのデータを ブロックデバイスへの操作で変更
sat
PRO
1
28
デバイスドライバ
sat
PRO
0
45
マルチスレッドの実現方法 ~カーネルスレッドとユーザスレッド~
sat
PRO
2
110
共有メモリ
sat
PRO
3
67
マルチスレッドプログラム
sat
PRO
3
55
Linuxのブートプロセス initramfs編
sat
PRO
2
76
Other Decks in Technology
See All in Technology
Amazon S3標準/ S3 Tables/S3 Express One Zoneを使ったログ分析
shigeruoda
3
400
Welcome to the LLM Club
koic
0
140
菸酒生在 LINE Taiwan 的後端雙刀流
line_developers_tw
PRO
0
1.1k
原則から考える保守しやすいComposable関数設計
moriatsushi
3
510
Agentic DevOps時代の生存戦略
kkamegawa
0
1.1k
エンジニア向け技術スタック情報
kauche
0
110
25分で解説する「最小権限の原則」を実現するための AWS「ポリシー」大全
opelab
9
2.3k
rubygem開発で鍛える設計力
joker1007
1
140
Uniadex__公開版_20250617-AIxIoTビジネス共創ラボ_ツナガルチカラ_.pdf
iotcomjpadmin
0
150
2年でここまで成長!AWSで育てたAI Slack botの軌跡
iwamot
PRO
2
490
_第3回__AIxIoTビジネス共創ラボ紹介資料_20250617.pdf
iotcomjpadmin
0
150
Snowflake Summit 2025 データエンジニアリング関連新機能紹介 / Snowflake Summit 2025 What's New about Data Engineering
tiltmax3
0
260
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
81
9k
How to train your dragon (web standard)
notwaldorf
92
6.1k
The Pragmatic Product Professional
lauravandoore
35
6.7k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Facilitating Awesome Meetings
lara
54
6.4k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
46
9.6k
Embracing the Ebb and Flow
colly
86
4.7k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Building an army of robots
kneath
306
45k
Navigating Team Friction
lara
187
15k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
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