working with unix processes を(途中まで) 読んだよ

22
Working With Unix Processes (途中まで) 読んだよ Katsuji Ishikawa <[email protected] >

Upload: katsuji-ishikawa

Post on 26-Jun-2015

422 views

Category:

Technology


1 download

DESCRIPTION

Working With Unix Processes を(途中まで) 読んだ。 社内自グループでの勉強会で使用。

TRANSCRIPT

Page 1: Working With Unix Processes を(途中まで) 読んだよ

Working With Unix Processes を(途中まで) 読んだよ

Katsuji Ishikawa <[email protected]>

Page 2: Working With Unix Processes を(途中まで) 読んだよ

menu

• Working With Unix Processes てなに

• 各チャプターまとめ

Page 3: 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.

Page 4: Working With Unix Processes を(途中まで) 読んだよ

各チャプターまとめ

Page 5: Working With Unix Processes を(途中まで) 読んだよ

その前に

• irb [Enter] したターミナル

• ひまなターミナルをいくつか

• 「アクティビティモニタ」も起動!

Page 6: Working With Unix Processes を(途中まで) 読んだよ

Processes Have IDs• プロセスは ID をもつよ

• 全てのプロセスは”ユニークなプロセス識別子” -- pid

をもつよ

• ただ単に数値でしかないよ• puts Process.pid してみよう!

• ログファイルでよくみるかも• システムコール: Process.pid は getpid(2)

Page 7: Working With Unix Processes を(途中まで) 読んだよ

Processes Have Parents• プロセスは親をもつよ

• 全てのプロセスは親プロセスをもつよ

• その親プロセスは 親プロセス識別子 - ppid として知られてるよ

• Mac OS X での例: ターミナルを起動, bash プロンプトに入る=>

bash の親がターミナル

• puts Process.ppid してみよう!

• ps -p <ppid-of-irb-process> してみよう!

• システムコール:Process.ppid は getppid(2)

Page 8: Working With Unix Processes を(途中まで) 読んだよ

Processes Have FIle Descriptors

• プロセスはファイルディスクリプタをもつよ

• すべてはファイル - *NIX の哲学のひとつとして、'すべてはファイル'だよ

• デバイスはファイルとして扱い、ソケットとパイプもファイルとして扱い、ファイルもファイルとして扱うよ

• ディスクリプタはリソースを表すよ

• プロセスがファイルを開くと、ファイルディスクリプタ(数) が割り当てられるよ

• ファイルディスクリプタはかんけーのないプロセスとは共有しないよ

Page 9: Working With Unix Processes を(途中まで) 読んだよ

Processes Have FIle Descriptors(cont.)

• プロセス終了すると閉じるよ• Ruby だと IO クラスだよ

• passwd = File.open('/etc/passwd')

• puts passwd.fileno

• 複数のファイルを開くとどうなる?

• 1. ファイルディスクリプタは使われてない最小値がつかわれる

• 2. 閉じるとそのファイルディスクリプタはまたつかえるようになる

Page 10: Working With Unix Processes を(途中まで) 読んだよ

Processes Have FIle Descriptors(cont.)

• 閉じたファイルが使ってたファイルディスクリプタを読んでみよう!

• 標準入出力 (STDIN, STDOUT, STDERR)

• ls -l /dev/std*

• puts STDIN.fileno

• puts STDOUT.fileno

• puts STDERR.fileno

Page 11: Working With Unix Processes を(途中まで) 読んだよ

Processes Have FIle Descriptors(cont.)

• ファイルディスクリプタはソケットやパイプなど、ネットワークプログラミングのコアなとこで使われるよ。あといろんなファイルの操作でも

• Ruby の IOクラスの多くのメソッドはシステムコールと同じ名前にマップしてるよ

• open(2), close(2), read(2), write(2), pipe(2), fsync(2), stat(2)...

Page 12: Working With Unix Processes を(途中まで) 読んだよ

Processes Have Resource Limits

• プロセスはリソースリミットをもってるよ

• リミットを確認してみよう!

• p Process.getrlimit(:NOFILE)

• [256, 9223372036854775807]

• 左: ソフトリミット, 右: ハードリミットだよ

• ソフトリミット: ほんとのリミットじゃないよ。増やせるよ。

• ハードリミット: ふつーは root だけが変更できるよ。

• ソフトリミットを増やしてみよう!

Page 13: Working With Unix Processes を(途中まで) 読んだよ

Processes Have Resource Limits

• 限界をこえると Errno:EMFILE が発生するよ

• ほかのリソース: nproc, fsize, stack とかあるよ

Page 14: Working With Unix Processes を(途中まで) 読んだよ

Processes Have Resource Limits

• 多くのプログラムでは変更は必要ないよ。数千のネットワーク接続が必要なときなどは変更するよ

• システムコール: Process.getrlimit は

getrlimit(2)、Process.setrlimit は

setrlimit(2) だよ

Page 15: Working With Unix Processes を(途中まで) 読んだよ

Processse Have an Enrivonment

• プロセスは環境(変数)をもつよ

• システムコール: setenv(3), getenv(3),

environ(7)

Page 16: Working With Unix Processes を(途中まで) 読んだよ

Processes Have Arguments

• プロセスは引数をもつよ

• はいれつ!

• argv.py, argv.rb

Page 17: Working With Unix Processes を(途中まで) 読んだよ

Processes Have Names

• プロセスは名前をもつよ

• irb のセッションは irb という名前

• python で変えようとしたらわからなくて泣きそうだったよ

Page 18: Working With Unix Processes を(途中まで) 読んだよ

Processes Have Exit Codes

• プロセスは終了コードをもつよ

• 0-255 のどれかだよ、0 は正常終了だよ

• どのように終了する?

• exit => 0 だよ

• exit 22 => 22 とゆー終了コードで終了するよ

• at_exit を使うとそのブロックを呼び出して終了するよ

• exit! => 1 だよ、at_exit のブロックはよびださないよ

• abort => 1だよ、at_exit 呼び出すよ

• raise は 例外を起こすよ

Page 19: Working With Unix Processes を(途中まで) 読んだよ

Processes Can Fork

• プロセスはフォークできるよ• 「fork(2) を使え、ルーク」だよ

• fork(2) で新しいプロセス作れるよ

• 新しいプロセスは元のプロセスのコピーだよ• 子プロセスは親プロセスのメモリ全てのコピーを継承するよ• 親プロセスのファイルディスクリプタもだよ• fork してみよう!

Page 20: Working With Unix Processes を(途中まで) 読んだよ

Processes Can Fork• マルチコアプログラミング?• 保証しないけどマルチコアで分散するよ• 500MB つかってるプロセスが fork(2) => 1GB つかうよ

• 10回 fork(2) でもするとさくっとメモリを食いつぶすよ

• copy-on-write の話はこのあとの(まだよんでない)チャプターにあるはずだよ

• fork bomb と呼ばれるよ

• Ruby の Kernel#fork は fork(2) にマップされてるよ

Page 21: Working With Unix Processes を(途中まで) 読んだよ

Orphaned Processes

• みなしごプロセス• プロセスを ctrl-c でとめると全部とまる?親だけ?

• 親だけだよ• 親が死ぬと子にはなにがおきる? なにも。

• みなしごは PID 1 のプロセスが親になるよ

• みてみよう!

Page 22: Working With Unix Processes を(途中まで) 読んだよ