宮水の日記

宮水の日記

主に書評や資格取得について記事を書いています。

なるほどUnixプロセス -Rubyで学ぶUnixの基礎-

今週は、なるほどUnixプロセスを読みました。

f:id:kattyan53:20200425183425p:plain

本書を読む前に

Unixに関して全くの初心者なので、チョットワカッタ気持ちになるために以下の記事を読みました。
この記事では、RubyUNIXプロセスをチョット体験できます。
『なるほどUnixプロセス』を読む前にちょっとだけナルホドとなる記事

本書を読んでいて、RubyのIOクラスについてよく出てきたので、ちょっと復習したりしました。
class IO (Ruby 2.7.0 リファレンスマニュアル)


本書で学べること

RubyUnixの子供と言っても過言ではなく、RubyUnixシステムコールや文化・思想を反映しているそうです。
本書は、Rubyのコードを通してUnixの考え方を学ぶUnixの入門書です。

なぜUnixを学ぶのか

Unixプロセスについて知ることで、アプリケーションで動いているどのコンポーネントファイヤーウォール、ロード・バランサー、リバース・プロキシ、httpキャッシュ、ジョブキュー、データベースなど)についても理解が深められるようになるはずとのこと。
プロジェクトの中身を把握することで、問題を素早く切り分けられるようになるそうです。

目次

第1章 はじめに
第2章 本書の手引き
第3章 プロセスにはIDがある
第4章 プロセスには親がいる
第5章 プロセスにはファイルディスクリプタがある
第6章 プロセスにはリソースの制限がある
第7章 プロセスには環境がある
第8章 プロセスには引数がある
第9章 プロセスには名前がある
第10章 プロセスには終了コードがある
第11章 プロセスは子プロセスを作れる
第12章 孤児プロセス
第13章 プロセスは優しい
第14章 プロセスは待てる
第15章 ゾンビプロセス
第16章 プロセスはシグナルを受信できる
第17章 プロセスは通信できる
第18章 デーモンプロセス
第19章 端末プロセスを作る
第20章 おわりに
付録1 Resqueのプロセス管理
付録2 Unicornのワーカープロセスの管理
付録3 preforkサーバ
付録4 Spyglass

本書の内容

システムコール

システムコールとは、カーネルとユーザーランドを取り次ぐもの。

カーネル... コンピュータのハードウェアの頂点。ハードウェアを制御するための中間層。
ユーザーランド... 私の書いたプログラミングが実行される場所。

システムコールが、プログラムとハードウェア間の相互作用を定義する。

ドキュメント

Unix系のコンピュータを使っていれば、以下のコマンドで見ることができる。
> man man

プロセス

Unixの原子。あらゆるコードはプロセス上で実行される。
本書では、プロセスにはIDがあるとか、親がいるとか、forkできるといったプロセスのことがたくさん解説されています。

ファイルディスクリプタ

Unixは全てがファイル。ディスクリプタとは、リソースのこと。

パイプ

パイプとは、単一方向のデータの流れ。「パイプを開く」とは、プロセスの片方の端を別のプロセスの片方の端に繋ぐこと。

デーモンプロセス

ユーザーに端末で制御されるのではなく、バックグラウンとで動作するプロセスのこと。
Webサーバやデータベースサーバのように、リクエストを裁くためにバックグラウンドで常に動作するプロセスなどがよくある例。

Resqueのプロセス管理

Resqueがforkをしているのは、並行性の実現や速度向上のためではなく、メモリ管理のために使っている点に注目して話が進む。
メモリ管理のためにforkを使っている箇所のコードを1行づつ解説されていた。

Resqueでは、メモリの使用量が肥大化しないようになっている。

Unicornのワーカープロセスの管理

UnicornはRackアプリケーション用のHTTPサーバ。大きく分けるとpreforkサーバに属する。
Unicornのマスタープロセスは、ワーカーのプロセスの死活監視をして死んでたら再起動したり、ワーカーがリクエストの処理に時間がかかりすぎていないか検査したりする。

preforkサーバ

preforkサーバとは、スレッドを使わず、先行してforkを行うWebサーバのこと。
あらかじめいくつかの子プロセスをforkしておき、forkの待ち時間をなくす方式をとっている。
forkされた子プロセスが一つ一つ対応する通信を受け持つため、ある子プロセスがフリーズしても他の子プロセスに影響を及ぼすことがなく通信を継続できるメリットがある。(Apache HTTP Server - Wikipedia より)

本書では、preforkモデルの効率的なメモリ利用、効率的な負荷分散、効率的なシステム管理について解説されている。

Spyglass

Spyglass はWebサーバ。Unix プログラミングの考え方を紹介するために書かれたプロジェクト。(実際にサーバとして使うことを目的としていない)

まとめ

1章1章が短く具体的にRubyを使って読み進められたのでとても楽しく読むことができました。
Rubyのこのメソッドは、Unixの考え方のこれ。って感じの話がずっと続くので、わかりやすかったです。

16章から内容が難しかったですが、特に付録にある「ResqueとUnicornの内部ではUnixプロセスをどう扱ってるか」はとても勉強になりました。workerやWebサーバーについてちょっとだけ「へぇーこんな風になってるんだ」と思いました。

この本を通してちょっとだけUnixの思想が理解できたら、次は以下の本を読むことをおすすめされていましたので、こちらを読んでいこうと思います!

The Art of UNIX Programming

The Art of UNIX Programming

UNIXという考え方―その設計思想と哲学

UNIXという考え方―その設計思想と哲学

  • 作者:Mike Gancarz
  • 発売日: 2001/02/01
  • メディア: 単行本


なるほどUnixプロセス -Rubyで学ぶUnixの基礎- はここから購入できます!
tatsu-zine.com

以上です!