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

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

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

Yuki Nakata chikuwait

September 01, 2019
Tweet

More Decks by Yuki Nakata chikuwait

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  15. なるほどわからん
    15

    View Slide

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

    View Slide

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

    View Slide