ApacheのPortが80の時のサービスon/offについて(2日目)
若干脱線気味だけど、プロセスとスレッドについて
1日目の続きを書いてみる。
$ ps auxw | grep httpd root 23947 0.0 0.2 70508 2504 ? Ss 23:17 0:00 /usr/local/apache2/bin/httpd -k start hogehoge 24410 0.0 0.4 414768 4140 ? Sl 23:26 0:00 /usr/local/apache2/bin/httpd -k start hogehoge 24411 0.0 0.4 611376 4804 ? Sl 23:26 0:00 /usr/local/apache2/bin/httpd -k start hogehoge 24412 0.0 0.4 414768 4152 ? Sl 23:26 0:00 /usr/local/apache2/bin/httpd -k start
上記のSsとSlについてですね。
プロセスとスレッド
情報処理の勉強してる時にプロセスとスレッドについては勉強していた気がするのですが、全くもって身についてない感があります。
1プログラム1プロセス、ってとこは認識あってるみたいで、CPUには本来1プロセスしか乗っからないんだけど、処理時間を適宜割り当てて切り替えることで擬似的にたくさんのプロセス動かしてますよー、と見せている(見せてるのかわからないですが)と。
で、スレッドというのはプロセスを細かくした実行単位、的なものだと認識しています。
例えば、1つのプログラムの処理時に、「入力を受け取る動作」と「出力を吐き出す動作」が必要になる場合があります。
簡単な処理なら別にいいと思うのですが、これを平行して動かしたいという時に、プロセス内部で入力・出力について別々に「スレッド」として動作してもらうと。
このスレッドの概念を有効活用したいねー、と考えて生み出されたのが「ライトウェイトプロセス」というのだそうです。
プロセスが使用するメモリ空間やオープンされたファイル等の「資源」を共有することで、プロセスの生成と切替の高速化を実現しています。
プロセス内部にスレッドがたくさんある場合、それらをライトウェイトプロセスとして扱うことで、いっぱいのコア上で処理を走り回らせることが可能になり、非常に効率のいい処理を実現できることとなります。(たぶん。)
CPU的には1つのプロセス内で複数のスレッドを動かしている。
システム的には複数のスレッドをライトウェイトプロセスとして動かしている。
のだそうです。頭良すぎてちょっとついていけない。
で、Apacheはそのマルチスレッドなアプリケーションなのだね?
以上のことから、サービスを起動するときにrootで起動はするけれども、クライアントとの通信を実際に受け持つのはhogehogeで動いているスレッド達だという認識に(勝手に)落ち着いたわけなのですが、これはいかがなものなのでしょう。
Apacheのコンパイル時、MPM(マルチプロセッシングモジュール*1)を選択することができます。
公式ドキュメントではUnix系はデフォルトでprefork
となっていますが、私がapachectl -l
したところevent.c
と表示されました。
当初の疑問だった「rootによるサービスの起動はセキュリティ的に大丈夫なのか」という拙い疑問は、半ば無理矢理感を醸し出しつつ解決したっぽいのですが、解決してますかねこれ。やべえ。
ちなみに
Apacheのディレクトリ内を漁っていたら、MPM関連の設定ファイル的なものを発見したのでメモ。
conf
配下にextra
があり、その配下のhttpd-mpm.conf
なるものです。(また調べ物が増えた…)
コンパイル後にMPMの変更もできるっぽい(どこかに設定ファイルがあるっぽい)ので、そっちも触れたら嬉しいなあ、というところで今回はここまで。
なんも解決してない感あるので継続して調査&修正します。
*1:preforek,worker,event