working with unix processes を(途中まで) 読んだよ
DESCRIPTION
Working With Unix Processes を(途中まで) 読んだ。 社内自グループでの勉強会で使用。TRANSCRIPT
Working With Unix Processes を(途中まで) 読んだよ
Katsuji Ishikawa <[email protected]>
menu
• Working With Unix Processes てなに
• 各チャプターまとめ
Working With Unix Processes てなに
• http://workingwithunixprocesses.com/
• What a file descriptor is and how it works.
• When you need a daemon process, and when you don't.
• Creating new processes with fork(2).
• 4 different ways to exit a process.
• The real world concerns of spawning shell commands and how to avoid them.
• High level discussion about the costs and pitfalls of creating processes.
• Defining signal handlers that don't steal from other developers.
• Internals of Resque and Unicorn and how they use this stuff.
• Lots more! It's 130 pages packed with guidelines, sample code, and best practices.
各チャプターまとめ
その前に
• irb [Enter] したターミナル
• ひまなターミナルをいくつか
• 「アクティビティモニタ」も起動!
Processes Have IDs• プロセスは ID をもつよ
• 全てのプロセスは”ユニークなプロセス識別子” -- pid
をもつよ
• ただ単に数値でしかないよ• puts Process.pid してみよう!
• ログファイルでよくみるかも• システムコール: Process.pid は getpid(2)
Processes Have Parents• プロセスは親をもつよ
• 全てのプロセスは親プロセスをもつよ
• その親プロセスは 親プロセス識別子 - ppid として知られてるよ
• Mac OS X での例: ターミナルを起動, bash プロンプトに入る=>
bash の親がターミナル
• puts Process.ppid してみよう!
• ps -p <ppid-of-irb-process> してみよう!
• システムコール:Process.ppid は getppid(2)
Processes Have FIle Descriptors
• プロセスはファイルディスクリプタをもつよ
• すべてはファイル - *NIX の哲学のひとつとして、'すべてはファイル'だよ
• デバイスはファイルとして扱い、ソケットとパイプもファイルとして扱い、ファイルもファイルとして扱うよ
• ディスクリプタはリソースを表すよ
• プロセスがファイルを開くと、ファイルディスクリプタ(数) が割り当てられるよ
• ファイルディスクリプタはかんけーのないプロセスとは共有しないよ
Processes Have FIle Descriptors(cont.)
• プロセス終了すると閉じるよ• Ruby だと IO クラスだよ
• passwd = File.open('/etc/passwd')
• puts passwd.fileno
• 複数のファイルを開くとどうなる?
• 1. ファイルディスクリプタは使われてない最小値がつかわれる
• 2. 閉じるとそのファイルディスクリプタはまたつかえるようになる
Processes Have FIle Descriptors(cont.)
• 閉じたファイルが使ってたファイルディスクリプタを読んでみよう!
• 標準入出力 (STDIN, STDOUT, STDERR)
• ls -l /dev/std*
• puts STDIN.fileno
• puts STDOUT.fileno
• puts STDERR.fileno
Processes Have FIle Descriptors(cont.)
• ファイルディスクリプタはソケットやパイプなど、ネットワークプログラミングのコアなとこで使われるよ。あといろんなファイルの操作でも
• Ruby の IOクラスの多くのメソッドはシステムコールと同じ名前にマップしてるよ
• open(2), close(2), read(2), write(2), pipe(2), fsync(2), stat(2)...
Processes Have Resource Limits
• プロセスはリソースリミットをもってるよ
• リミットを確認してみよう!
• p Process.getrlimit(:NOFILE)
• [256, 9223372036854775807]
• 左: ソフトリミット, 右: ハードリミットだよ
• ソフトリミット: ほんとのリミットじゃないよ。増やせるよ。
• ハードリミット: ふつーは root だけが変更できるよ。
• ソフトリミットを増やしてみよう!
Processes Have Resource Limits
• 限界をこえると Errno:EMFILE が発生するよ
• ほかのリソース: nproc, fsize, stack とかあるよ
Processes Have Resource Limits
• 多くのプログラムでは変更は必要ないよ。数千のネットワーク接続が必要なときなどは変更するよ
• システムコール: Process.getrlimit は
getrlimit(2)、Process.setrlimit は
setrlimit(2) だよ
Processse Have an Enrivonment
• プロセスは環境(変数)をもつよ
• システムコール: setenv(3), getenv(3),
environ(7)
Processes Have Arguments
• プロセスは引数をもつよ
• はいれつ!
• argv.py, argv.rb
Processes Have Names
• プロセスは名前をもつよ
• irb のセッションは irb という名前
• python で変えようとしたらわからなくて泣きそうだったよ
Processes Have Exit Codes
• プロセスは終了コードをもつよ
• 0-255 のどれかだよ、0 は正常終了だよ
• どのように終了する?
• exit => 0 だよ
• exit 22 => 22 とゆー終了コードで終了するよ
• at_exit を使うとそのブロックを呼び出して終了するよ
• exit! => 1 だよ、at_exit のブロックはよびださないよ
• abort => 1だよ、at_exit 呼び出すよ
• raise は 例外を起こすよ
Processes Can Fork
• プロセスはフォークできるよ• 「fork(2) を使え、ルーク」だよ
• fork(2) で新しいプロセス作れるよ
• 新しいプロセスは元のプロセスのコピーだよ• 子プロセスは親プロセスのメモリ全てのコピーを継承するよ• 親プロセスのファイルディスクリプタもだよ• fork してみよう!
Processes Can Fork• マルチコアプログラミング?• 保証しないけどマルチコアで分散するよ• 500MB つかってるプロセスが fork(2) => 1GB つかうよ
• 10回 fork(2) でもするとさくっとメモリを食いつぶすよ
• copy-on-write の話はこのあとの(まだよんでない)チャプターにあるはずだよ
• fork bomb と呼ばれるよ
• Ruby の Kernel#fork は fork(2) にマップされてるよ
Orphaned Processes
• みなしごプロセス• プロセスを ctrl-c でとめると全部とまる?親だけ?
• 親だけだよ• 親が死ぬと子にはなにがおきる? なにも。
• みなしごは PID 1 のプロセスが親になるよ
• みてみよう!