Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ゆるくプロセスを学ぼう/yuruhako-0824-process

 ゆるくプロセスを学ぼう/yuruhako-0824-process

9fdb3aa57e5fb99b3772976b0b903e53?s=128

Yuki Nakata chikuwait

September 01, 2019
Tweet

Transcript

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

  2. chikuwaitです • Twitter : chiku_wait • 高度ICTコース B4 • システムソフトウェア研究室

    • OSや仮想化技術(ハイパーバイザ,コンテナ) などの システムソフトウェア(低レイヤ) が好き • Linux(を使うことではなく仕組みなどが)が好き 自己紹介 2
  3. • オープンソースOSのLinuxのプロセスをメインで扱います • 対象のソースコードはLinux kernel 2.6 前提 3

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

    4 Windows だとこれ→
  5. プロセスとスレッドの関係 5 プロセス1 共有メモリ スレッド2 スレッド1 プロセス2 共有メモリ スレッド1

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

    init login … sh vim …
  7. • 大きく分けてテキスト、データ、スタックに分割 • データ:グローバル変数、static変数、malloc() 等 で確保したもの • スタック:関数の局所変数と、関数の引数 • スタックの底:引数と環境変数

    • 0番地付近は、メモリを割り当てない • いわゆるNULLポインタ プロセスのメモリ構造 7 カーネル領域 スタック(局所変数等) ヒープ(mallocで確保) 初期化なし静的変数 初期化付き静的変数 テキスト(機械語) Low address High address
  8. 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 …
  9. TASK_RUNNING • あるCPUで実行中華、実行可能でCPU割当を待っている TASK_INTERRUPTIBLE • シグナルが受信可能で待機している(シグナルを受信すると起床する) TASK_UNINTERRUPTIBLE • シグナル受信不可で待機中 TASK_STOPPED

    • 実行停止中(SIGSTOPなどを受信したり、ptraceで実行停止中) 8つのプロセス実行状態(1/2) 9
  10. TASK_TRACED • Ptraceによるトレース対象になっている TASK_NONINTERACTIVE • 非対話的処理(スケジューラへのヒント) EXIT_ZOMBIE • 通称ゾンビ状態、実行終了して親プロセスによるwait待ち EXIT_DEAD

    • 実行終了して、task_structを開放中 8つのプロセス実行状態(2/2) 10
  11. プロセスの状態遷移 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. プロセスのライフサイクル 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. プロセスのライフサイクル 13 execve():execファミリのシステムコール • 今まで使用していた空間を破棄して 新たな空間にプログラムをロードする do_execve() • ファイル名、環境変数、引数のページをコピー •

    コピーした領域はexec後にマップする • バイナリローダを試す clone execve do_fork copy_process ロード 実行 do_execve バイナリローダ 終了 exit do_exit
  14. プロセスのライフサイクル 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. なるほどわからん 15

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

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

    e.g. Thread で、プロセスが分かって何になるの? 17