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

  • 386 views
Uploaded on

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

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
386
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
1
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Working With Unix Processes を(途中まで) 読んだよ Katsuji Ishikawa <katsuji.ishikawa@gmail.com>
  • 2. menu• Working With Unix Processes てなに• 各チャプターまとめ
  • 3. 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 dont. • 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 dont steal from other developers. • Internals of Resque and Unicorn and how they use this stuff. • Lots more! Its 130 pages packed with guidelines, sample code, and best practices.
  • 4. 各チャプターまとめ
  • 5. その前に• irb [Enter] したターミナル• ひまなターミナルをいくつか• 「アクティビティモニタ」も起動!
  • 6. Processes Have IDs• プロセスは ID をもつよ• 全てのプロセスは”ユニークなプロセス識別子” -- pid をもつよ• ただ単に数値でしかないよ• puts Process.pid してみよう!• ログファイルでよくみるかも• システムコール: Process.pid は getpid(2)
  • 7. Processes Have Parents• プロセスは親をもつよ• 全てのプロセスは親プロセスをもつよ• その親プロセスは 親プロセス識別子 - ppid として知られてるよ• Mac OS X での例: ターミナルを起動, bash プロンプトに入る=> bash の親がターミナル• puts Process.ppid してみよう!• ps -p <ppid-of-irb-process> してみよう!• システムコール:Process.ppid は getppid(2)
  • 8. Processes Have FIle Descriptors• プロセスはファイルディスクリプタをもつよ• すべてはファイル - *NIX の哲学のひとつとして、すべてはファイ ルだよ• デバイスはファイルとして扱い、ソケットとパイプもファイルとして 扱い、ファイルもファイルとして扱うよ• ディスクリプタはリソースを表すよ• プロセスがファイルを開くと、ファイルディスクリプタ(数) が割り当 てられるよ• ファイルディスクリプタはかんけーのないプロセスとは共有しないよ
  • 9. Processes Have FIle Descriptors(cont.)• プロセス終了すると閉じるよ• Ruby だと IO クラスだよ• passwd = File.open(/etc/passwd)• puts passwd.fileno• 複数のファイルを開くとどうなる?• 1. ファイルディスクリプタは使われてない最小値がつかわれる• 2. 閉じるとそのファイルディスクリプタはまたつかえるように なる
  • 10. Processes Have FIle Descriptors(cont.)• 閉じたファイルが使ってたファイルディスクリ プタを読んでみよう!• 標準入出力 (STDIN, STDOUT, STDERR)• ls -l /dev/std*• puts STDIN.fileno• puts STDOUT.fileno• puts STDERR.fileno
  • 11. Processes Have FIle Descriptors(cont.)• ファイルディスクリプタはソケットやパイプな ど、ネットワークプログラミングのコアなとこで 使われるよ。あといろんなファイルの操作でも• Ruby の IOクラスの多くのメソッドはシステムコ ールと同じ名前にマップしてるよ• open(2), close(2), read(2), write(2), pipe(2), fsync(2), stat(2)...
  • 12. Processes Have Resource Limits• プロセスはリソースリミットをもってるよ• リミットを確認してみよう! • p Process.getrlimit(:NOFILE) • [256, 9223372036854775807]• 左: ソフトリミット, 右: ハードリミットだよ• ソフトリミット: ほんとのリミットじゃないよ。増やせるよ。• ハードリミット: ふつーは root だけが変更できるよ。• ソフトリミットを増やしてみよう!
  • 13. Processes Have Resource Limits• 限界をこえると Errno:EMFILE が発生す るよ• ほかのリソース: nproc, fsize, stack とかあ るよ
  • 14. Processes Have Resource Limits• 多くのプログラムでは変更は必要ない よ。数千のネットワーク接続が必要な ときなどは変更するよ• システムコール: Process.getrlimit は getrlimit(2)、Process.setrlimit は setrlimit(2) だよ
  • 15. Processse Have an Enrivonment• プロセスは環境(変数)をもつよ• システムコール: setenv(3), getenv(3), environ(7)
  • 16. Processes Have Arguments• プロセスは引数をもつよ• はいれつ!• argv.py, argv.rb
  • 17. Processes Have Names• プロセスは名前をもつよ• irb のセッションは irb という名前• python で変えようとしたらわからなく て泣きそうだったよ
  • 18. Processes Have Exit Codes• プロセスは終了コードをもつよ• 0-255 のどれかだよ、0 は正常終了だよ• どのように終了する? • exit => 0 だよ • exit 22 => 22 とゆー終了コードで終了するよ • at_exit を使うとそのブロックを呼び出して終了するよ • exit! => 1 だよ、at_exit のブロックはよびださないよ • abort => 1だよ、at_exit 呼び出すよ • raise は 例外を起こすよ
  • 19. Processes Can Fork• プロセスはフォークできるよ• 「fork(2) を使え、ルーク」だよ• fork(2) で新しいプロセス作れるよ• 新しいプロセスは元のプロセスのコピーだよ• 子プロセスは親プロセスのメモリ全てのコピーを継承するよ• 親プロセスのファイルディスクリプタもだよ• fork してみよう!
  • 20. Processes Can Fork• マルチコアプログラミング?• 保証しないけどマルチコアで分散するよ• 500MB つかってるプロセスが fork(2) => 1GB つかうよ• 10回 fork(2) でもするとさくっとメモリを食いつぶすよ • copy-on-write の話はこのあとの(まだよんでない)チャ プターにあるはずだよ• fork bomb と呼ばれるよ• Ruby の Kernel#fork は fork(2) にマップされてるよ
  • 21. Orphaned Processes• みなしごプロセス• プロセスを ctrl-c でとめると全部とまる?親だけ?• 親だけだよ• 親が死ぬと子にはなにがおきる? なにも。• みなしごは PID 1 のプロセスが親になるよ• みてみよう!