Working With Unix Processes を読んだ
Working With Unix Processes (English Edition)
- 作者: Jesse Storimer
- 発売日: 2011/12/20
- メディア: Kindle版
- クリック: 1回
- この商品を含むブログ (1件) を見る
この前読んだ本と同じ作者が書いている。
Working with TCP Sockets を読んだ - tnakata's blog
こちらもサンプルソースはRubyで書かれている。Ruby書いててプロセスのことまだ何もわかってない(言語化できてない)という人にはいいかもしれない。
読もうと思った理由
- プロセスの概念を言語化したいから。
読んでて勉強になった部分
- プロセスとはUnix上での処理単位。どんなプログラムもプロセスの中で実行される。
- 例えば、irbを実行するとプロセスが一つ立ち上がる。
ps
コマンドを実行することで立ち上がったプロセスの存在を確認できる。
- 例えば、irbを実行するとプロセスが一つ立ち上がる。
- Unixでは全てはFileとして扱われる。
- プロセスはforkでコピーできる(子プロセスが作られる)。並列処理に関係するところ。
- 子プロセスが終了したのに親プロセスが
Process.wait
を実行しないと、子プロセスのメモリは解放されないままになる。Zombie Processという。 - シグナルという概念がある。プロセス間、もしくはキーボードからプロセスへシグナルを送り、プロセスを終わらせることができる。
Ctrl+C
によるプロセスの強制終了やProcess.kill
- ちょっと自信がないが、ソケットを利用したやり取りとは異なる概念。
- プロセス間の通信で代表的なものはパイプとソケット。どちらもデータの流れはSTREAM(データの始まりと終わりの目印がない)。
- STREAMの反対はMESSAGE。UNIXソケットで利用される。
- Daemon Processesとはバックグラウンドで走っているプロセスのこと。
- 全てのプロセスの親としてinitプロセスがある。
- execrc(2)で現在のプロセスを他のプロセスに変えることができる。Rubyのexecはexecrc(2)のラッパー。なおプロセスを変えた後に元のプロセスに自動で戻ることはない。
- Ruby のexecは元のプロセスのfile descriptorsを全て閉じる。メモリリークを防ぐため。
- PreforkingはCopy on Writeによってメモリを効率的に使用できる。
- CoWはコピーしたプロセスを使う(たしかacceptした)タイミングでメモリがコピーされるので効率的とのこと。
読んでてよくわからなかったところは以下の通り。
- Zombie ProcessやDaemon Processが実際にどのようなときに使われるのか
- 仕事でやってることとどう結びつければよいか