プロセス
実行中のプログラム。 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.