Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
ゆるくプロセスを学ぼう/yuruhako-0824-process
Yuki Nakata chikuwait
September 01, 2019
Programming
0
240
ゆるくプロセスを学ぼう/yuruhako-0824-process
Yuki Nakata chikuwait
September 01, 2019
Tweet
Share
More Decks by Yuki Nakata chikuwait
See All by Yuki Nakata chikuwait
コンテナ型クラウドサービス基盤における集中型ネットワーク隔離手法/ master-thesis
chikuwait
0
70
Concentrated Isolation for Container Networks Toward Application-aware Sandbox Tailoring / UCC-21
chikuwait
0
39
SKBパケット選抜総選挙 〜 僕たちは誰について行けばいい? 〜 /osc21do
chikuwait
11
2.7k
コンテナ型仮想化技術におけるネットワーク分離の研究事情/ Infra-study LT
chikuwait
2
700
「おいしくてつよくなる」eBPFのはじめかた/Learn eBPF
chikuwait
11
4.1k
マルチテナント向けコンテナ環境における軽量かつ柔軟なARPスプーフィング対策の実現 / OS 148
chikuwait
4
1.5k
権力の話/ryukyu-fun-lt-chikuwa
chikuwait
1
190
Implementation and Status of 'mruby in BitVisor'
chikuwait
0
360
My Challenge of embedding mruby into a bare-metal hypervisor
chikuwait
2
940
Other Decks in Programming
See All in Programming
僕が便利だと感じる Snow Monkey の特徴/20220723_Gifu_WordPress_Meetup
oleindesign
0
110
NestJS_meetup_atamaplus
atamaplus
0
210
読みやすいコード クラスメソッド 2022 年度新卒研修
januswel
0
2.9k
プロダクトの成長とSREと
takuyatezuka
0
120
ちょっとつよい足トラ
logilabo
0
390
FullStack eXchange, July 2022
brucel
0
200
How GitHub Supports Vim License Detection, The Five Years Journey
othree
1
370
Google I/O 2022 Android関連概要 / Google I/O 2022 Android summary
phicdy
0
390
Pluggable Storage in PostgreSQL
sira
1
190
ZOZOTOWNにおけるDatadogの活用と、それを支える全社管理者の取り組み / 2022-07-27
tippy
1
3.2k
料理の注文メニューの3D化への挑戦
hideg
0
280
Windows コンテナ Dojo 第5回 OpenShift で学ぶ Kubernetes 入門
oniak3ibm
PRO
0
180
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
48
2.6k
Streamline your AJAX requests with AmplifyJS and jQuery
dougneiner
127
8.5k
Art Directing for the Web. Five minutes with CSS Template Areas
malarkey
196
9.5k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_i
25
15k
Web Components: a chance to create the future
zenorocha
303
40k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
226
15k
Pencils Down: Stop Designing & Start Developing
hursman
113
9.8k
Designing with Data
zakiwarfel
91
4k
Practical Orchestrator
shlominoach
178
8.7k
Happy Clients
brianwarren
89
5.6k
Atom: Resistance is Futile
akmur
255
20k
Building a Scalable Design System with Sketch
lauravandoore
448
30k
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