プロセス

プロセス

執筆済 コンピュータOS

実行中のプログラム。 OS が資源を割り当てる単位。

何を持つか#

要素 内容
独立したアドレス空間 他のプロセスから見えない
プロセス ID 識別子
ファイル記述子表 開いているファイル
レジスタの状態 中断時に保存される
権限 ユーザ ID、能力

アドレス空間が独立していることが本質。 これにより 1 つのプロセスが落ちても他に波及しない。

状態#

        生成
         ↓
      [実行可能] ⇄ [実行中]
         ↑           ↓
      [待機中] ←─────┘ (I/O 待ちなど)
                     ↓
                   終了

生成 — fork と exec#

Unix では 2 つの操作に分かれている。

fork()  … 自分の複製を作る(親と子)
exec()  … 自分を別のプログラムで置き換える

分かれているのは、 その間に子の環境を設定できるから。 リダイレクト、パイプ接続、権限の降格などをここで行う。 シェルのパイプはこの仕組みで実装されている。

コピーオンライト#

fork でアドレス空間全体を複製するのは高価。 実際にはページテーブルだけ複製し、 書き込みが起きたときに初めて実際のコピーを作る

多くの場合 fork の直後に exec するので、 コピーはほとんど起きない。

コンテキストスイッチ#

プロセスを切り替えるとき、 レジスタを保存・復元し、ページテーブルを切り替える。

直接のコストは数マイクロ秒だが、 キャッシュと TLB が汚れる間接コストの方が大きい。 切り替えが多いと性能が大きく落ちる。

参考文献#

  • Remzi H. Arpaci-Dusseau, Andrea C. Arpaci-Dusseau. Operating Systems: Three Easy Pieces. Arpaci-Dusseau Books, 2018.(全文公開) https://pages.cs.wisc.edu/~remzi/OSTEP/
  • Randal E. Bryant, David R. O’Hallaron. Computer Systems: A Programmer’s Perspective, 3rd ed. Pearson, 2016. https://csapp.cs.cmu.edu/
  • Andrew S. Tanenbaum, Herbert Bos. Modern Operating Systems, 4th ed. Pearson, 2014.
ノート一覧を閉じる