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
ゆるくプロセスを学ぼう/yuruhako-0824-process
Search
Yuki Nakata chikuwait
September 01, 2019
Programming
0
470
ゆるくプロセスを学ぼう/yuruhako-0824-process
Yuki Nakata chikuwait
September 01, 2019
Tweet
Share
More Decks by Yuki Nakata chikuwait
See All by Yuki Nakata chikuwait
BitVisorであやつるコンテナネットワーク/BitVisorSummit11
chikuwait
0
680
コンテナ型クラウドサービス基盤における集中型ネットワーク隔離手法/ master-thesis
chikuwait
0
340
Concentrated Isolation for Container Networks Toward Application-aware Sandbox Tailoring / UCC-21
chikuwait
0
250
SKBパケット選抜総選挙 〜 僕たちは誰について行けばいい? 〜 /osc21do
chikuwait
24
4k
コンテナ型仮想化技術におけるネットワーク分離の研究事情/ Infra-study LT
chikuwait
2
1.1k
「おいしくてつよくなる」eBPFのはじめかた/Learn eBPF
chikuwait
14
6.4k
マルチテナント向けコンテナ環境における軽量かつ柔軟なARPスプーフィング対策の実現 / OS 148
chikuwait
4
1.9k
権力の話/ryukyu-fun-lt-chikuwa
chikuwait
1
260
Implementation and Status of 'mruby in BitVisor'
chikuwait
0
650
Other Decks in Programming
See All in Programming
DDDを志して3年経ったら「DDDの皮を被ったクリーンアーキテクチャ」になった話【デブサミ2024夏】
texmeijin
1
620
DynamoDB コスト最適化っぽいことの基本 with Terraform
kuro_kurorrr
2
250
Activities at Cairo Library
cairolibrary720
0
1.2k
OpenAI/Gemini APIを使って EPUBを翻訳するCLIツールをつくってみた
tomiyan
0
790
今こそ始める、CDKコンストラクトライブラリ開発 ― 入門から実践まで
tmokmss
1
930
Composing an API the *right* way (Droidcon Berlin 2024)
zsmb
1
450
From Spring Boot 2 to Spring Boot 3 with Java 22 and Jakarta EE
ivargrimstad
0
1.9k
Async Await: Mastering Python's Time-Bending Tricks - EuroPython2024
yanbo
1
290
CSC307 Lecture 13
javiergs
PRO
0
150
12年前の『型システム入門』翻訳の思い出話
mame
11
1.2k
Architectures with Lightweight Stores: New Rules and Options
manfredsteyer
PRO
0
100
Namespace on read
tagomoris
2
370
Featured
See All Featured
ParisWeb 2013: Learning to Love: Crash Course in Emotional UX Design
dotmariusz
105
6.8k
In The Pink: A Labor of Love
frogandcode
139
22k
Writing Fast Ruby
sferik
623
60k
Side Projects
sachag
451
42k
Designing with Data
zakiwarfel
96
5k
Building an army of robots
kneath
301
42k
What's in a price? How to price your products and services
michaelherold
239
11k
Designing the Hi-DPI Web
ddemaree
276
34k
The Cost Of JavaScript in 2023
addyosmani
31
4.7k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
24
1.8k
For a Future-Friendly Web
brad_frost
173
9.2k
Imperfection Machines: The Place of Print at Facebook
scottboms
262
13k
Transcript
プロセスを学ぼう chikuwait 1 2019/08/24 ゆるい勉強会 in はこだて#3
chikuwaitです • Twitter : chiku_wait • 高度ICTコース B4 • システムソフトウェア研究室
• OSや仮想化技術(ハイパーバイザ,コンテナ) などの システムソフトウェア(低レイヤ) が好き • Linux(を使うことではなく仕組みなどが)が好き 自己紹介 2
• オープンソースOSのLinuxのプロセスをメインで扱います • 対象のソースコードはLinux kernel 2.6 前提 3
動作中のプログラムのこと • 処理実行の基本単位で、独立した仮想メモリ空間を持つ • バグで異常終了しても他のプロセスには影響を与えない • プロセスは同一メモリ空間などを共有する1つ以上のスレッドからなる • スレッド:1つのプロセス内で複数の処理を同時に実行できる実行単位 プロセスとは
4 Windows だとこれ→
プロセスとスレッドの関係 5 プロセス1 共有メモリ スレッド2 スレッド1 プロセス2 共有メモリ スレッド1
• プロセスを生成したときに生成した側が親、された側が子になる • プロセスは複数の子を持つことができ、その子が更に子を持てる(孫) • 最も遠い祖先はinitプロセス • 全てのプロセスはinitプロセスを起原にもつ プロセスの親子関係 6
init login … sh vim …
• 大きく分けてテキスト、データ、スタックに分割 • データ:グローバル変数、static変数、malloc() 等 で確保したもの • スタック:関数の局所変数と、関数の引数 • スタックの底:引数と環境変数
• 0番地付近は、メモリを割り当てない • いわゆるNULLポインタ プロセスのメモリ構造 7 カーネル領域 スタック(局所変数等) ヒープ(mallocで確保) 初期化なし静的変数 初期化付き静的変数 テキスト(機械語) Low address High address
task_struct構造体 (include/linux/sched.h) • state: プロセスの実行状態を表現 • thread_info: カーネルに関する低レベル情報と カーネルスタックの保持 •
mm:プロセスのメモリ管理 • binfmt:実行ファイルローダ • pid:プロセスID Linuxカーネルにおけるプロセスの表現 8 volatile long state(TASK_XXX) struct thread_info* thread_info unsigned long flags … prio_array_t* array … struct mm_struct *mm Struct linux_binfmt* binfmt … pid_t pid …
TASK_RUNNING • あるCPUで実行中華、実行可能でCPU割当を待っている TASK_INTERRUPTIBLE • シグナルが受信可能で待機している(シグナルを受信すると起床する) TASK_UNINTERRUPTIBLE • シグナル受信不可で待機中 TASK_STOPPED
• 実行停止中(SIGSTOPなどを受信したり、ptraceで実行停止中) 8つのプロセス実行状態(1/2) 9
TASK_TRACED • Ptraceによるトレース対象になっている TASK_NONINTERACTIVE • 非対話的処理(スケジューラへのヒント) EXIT_ZOMBIE • 通称ゾンビ状態、実行終了して親プロセスによるwait待ち EXIT_DEAD
• 実行終了して、task_structを開放中 8つのプロセス実行状態(2/2) 10
プロセスの状態遷移 11 TASK_RUNNING (実行中) TASK_STOPPED TASK_RUNNING (実行待ち) TASK_UNINTER RUPTIBLE TASK_INTERRU
PTIBLE EXIT_ZOMBIE EXIT_DEAD プロセス開放 プロセス生成 fork,clone exec clone(CLONE_STOPEED) ptrace_notify() 起床 プリエンプト スケジューリング 起床 起床 do_exit() wait exit wait
プロセスのライフサイクル 12 clone execve do_fork copy_process ロード 実行 do_fork():fork/vfork/cloneシステムコールの実体 •
共有する資源のフラグ、スタックサイズ などが引数 • 処理の大半は資源の複製を作成 • e.g. CLONE_VM:メモリ空間(mm_struct)の共有 copy_process():資源の複製処理の実体 • do_forkのフラグの指定によって参照を 増やしたりメモリを確保したりする • task_struct構造体などの複製 do_execve バイナリローダ 終了 exit do_exit
プロセスのライフサイクル 13 execve():execファミリのシステムコール • 今まで使用していた空間を破棄して 新たな空間にプログラムをロードする do_execve() • ファイル名、環境変数、引数のページをコピー •
コピーした領域はexec後にマップする • バイナリローダを試す clone execve do_fork copy_process ロード 実行 do_execve バイナリローダ 終了 exit do_exit
プロセスのライフサイクル 14 バイナリローダ:実行ファイルをメモリ上に展開 • Linuxは複数の実行ファイルフォーマットが 使用できるので、それに合わせて切り替える • e.g. ELFローダ:fs/binfmt_elf.c do_exit():プロセス終了時に呼び出される
• exit_notify():プロセスが終了したことを親に通知 • reparent():終了したプロセスの子プロセスを他 のプロセスの子プロセスにする • __exit_mm():mm_structの開放 clone execve do_fork copy_process ロード 実行 do_execve バイナリローダ 終了 exit do_exit
なるほどわからん 15
3年のオペレーティングシステムの授業でやるはず (Linuxのソースコードまでは触れない) 16
OSの気持ちがほんの少しだけ分かるようになる • 別にプロセスを知ったところで、今日からOSを作れる訳でもないし、 アプリを作れるようになるわけでもないです • 別に普段考えなくていいけど、知らないで考えないより、知った上で 任せる方が良いですよね • OSの挙動や仕組みを知ることで、普段書いているプログラミングで 使っている仕組みを理解することができる
e.g. Thread で、プロセスが分かって何になるの? 17