Slide 1

Slide 1 text

プロセスを学ぼう chikuwait 1 2019/08/24 ゆるい勉強会 in はこだて#3

Slide 2

Slide 2 text

chikuwaitです • Twitter : chiku_wait • 高度ICTコース B4 • システムソフトウェア研究室 • OSや仮想化技術(ハイパーバイザ,コンテナ) などの システムソフトウェア(低レイヤ) が好き • Linux(を使うことではなく仕組みなどが)が好き 自己紹介 2

Slide 3

Slide 3 text

• オープンソースOSのLinuxのプロセスをメインで扱います • 対象のソースコードはLinux kernel 2.6 前提 3

Slide 4

Slide 4 text

動作中のプログラムのこと • 処理実行の基本単位で、独立した仮想メモリ空間を持つ • バグで異常終了しても他のプロセスには影響を与えない • プロセスは同一メモリ空間などを共有する1つ以上のスレッドからなる • スレッド:1つのプロセス内で複数の処理を同時に実行できる実行単位 プロセスとは 4 Windows だとこれ→

Slide 5

Slide 5 text

プロセスとスレッドの関係 5 プロセス1 共有メモリ スレッド2 スレッド1 プロセス2 共有メモリ スレッド1

Slide 6

Slide 6 text

• プロセスを生成したときに生成した側が親、された側が子になる • プロセスは複数の子を持つことができ、その子が更に子を持てる(孫) • 最も遠い祖先はinitプロセス • 全てのプロセスはinitプロセスを起原にもつ プロセスの親子関係 6 init login … sh vim …

Slide 7

Slide 7 text

• 大きく分けてテキスト、データ、スタックに分割 • データ:グローバル変数、static変数、malloc() 等 で確保したもの • スタック:関数の局所変数と、関数の引数 • スタックの底:引数と環境変数 • 0番地付近は、メモリを割り当てない • いわゆるNULLポインタ プロセスのメモリ構造 7 カーネル領域 スタック(局所変数等) ヒープ(mallocで確保) 初期化なし静的変数 初期化付き静的変数 テキスト(機械語) Low address High address

Slide 8

Slide 8 text

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 …

Slide 9

Slide 9 text

TASK_RUNNING • あるCPUで実行中華、実行可能でCPU割当を待っている TASK_INTERRUPTIBLE • シグナルが受信可能で待機している(シグナルを受信すると起床する) TASK_UNINTERRUPTIBLE • シグナル受信不可で待機中 TASK_STOPPED • 実行停止中(SIGSTOPなどを受信したり、ptraceで実行停止中) 8つのプロセス実行状態(1/2) 9

Slide 10

Slide 10 text

TASK_TRACED • Ptraceによるトレース対象になっている TASK_NONINTERACTIVE • 非対話的処理(スケジューラへのヒント) EXIT_ZOMBIE • 通称ゾンビ状態、実行終了して親プロセスによるwait待ち EXIT_DEAD • 実行終了して、task_structを開放中 8つのプロセス実行状態(2/2) 10

Slide 11

Slide 11 text

プロセスの状態遷移 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

Slide 12

Slide 12 text

プロセスのライフサイクル 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

Slide 13

Slide 13 text

プロセスのライフサイクル 13 execve():execファミリのシステムコール • 今まで使用していた空間を破棄して 新たな空間にプログラムをロードする do_execve() • ファイル名、環境変数、引数のページをコピー • コピーした領域はexec後にマップする • バイナリローダを試す clone execve do_fork copy_process ロード 実行 do_execve バイナリローダ 終了 exit do_exit

Slide 14

Slide 14 text

プロセスのライフサイクル 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

Slide 15

Slide 15 text

なるほどわからん 15

Slide 16

Slide 16 text

3年のオペレーティングシステムの授業でやるはず (Linuxのソースコードまでは触れない) 16

Slide 17

Slide 17 text

OSの気持ちがほんの少しだけ分かるようになる • 別にプロセスを知ったところで、今日からOSを作れる訳でもないし、 アプリを作れるようになるわけでもないです • 別に普段考えなくていいけど、知らないで考えないより、知った上で 任せる方が良いですよね • OSの挙動や仕組みを知ることで、普段書いているプログラミングで 使っている仕組みを理解することができる e.g. Thread で、プロセスが分かって何になるの? 17