今更ながら、プロセスとかスレッドとか調べ直してみる。

ども、こんばんわ、コツツミです。

昨日の地震のときに情報だすのにブログ書いてから、まぁ何も書いてなかったので。
(なんか、よくわからないですが、やっぱツイッターの影響か、昨日アクセス数が異常にのびましたw)
というか、メモしようかと。

最近、Mac Book Proを購入しました。Sandy BridgeのCore i7です。まぁ2週間ちょっと使ってみて、満足しています。特にVMWareの動作速度は目を見張る物がありますね。
MBP自体はどうでもいいのですが、このCPUで”マルチスレッド”、”コア”など普通に記事でも見かけますし、プログラムを組んでいると”プロセス”、”スレッド”なんて普通に話をします。

ただ、恥ずかしい話ですが、正直・・・よくわかってません!!(威張れないですけど)

そんなことは知らなくても生きていけます。
でもプログラマとしてまずい気がしてきました。いや、知らなくても生きていけます。でもそれって、勉強したくない人が「数学できなくたって生きていけるもん」とかいってるのと同じです。
正確には算数くらいできないと生きていけない世の中な気はしますが・・・。

知ってる人は知ってるとおり、僕はいま、Next JS というフレームワーク&アプリケーションサーバーをがんばって開発しています。
あまり更新されていないような感じになっていますが、git見てる人はわかるとおり、0.7.0devというブランチで試行錯誤しています。

node.jsでHTTPサーバーなどを作成すると、当たり前のようにコンソールが停止します。
非常に使いづらいので、デーモン化しよう!start|stop|restartで起動や停止・再起動をさせようと思って、C++でアドオンも見よう見まねで作りました。

ここまではよかったんです。

フレームワークとかサーバーってやっぱりパフォーマンスが大事です。常に追求していきたいし、遅い物なんて使いたくないのは誰でもそうだとおもいます。
で、調べたら「シングルプロセス」だけじゃなくて「マルチプロセス」で動作させることによって、最近はやり?の2コアだの4コア(クアッド)だのいう部分が利用されるとのこと。

へ〜・・・。

理屈は理解できます。が、どうやんのよ?やるだろこれは。と意気揚々と、取り組み初めて2日目。

挫折。。。。

原因は、わかってるんです。
それが、題名のプロセス・スレッドだのの根本的な知識が足りないから。なのです。

そして、入門サイトなどを探してみても見当たらず。UNIXソケットとかいわれてもわかんねーし。
ソケットの話みてるとファイルポインタとかと結びついてきていみわかんねーし。
色々プログラムみてみても、いみわかんねーし。

自分の勉強不足に、マジで切れそうになりながら、冷蔵庫の”ほろよい”のんで、ほろよい。
寝る・・・無理、ねれない。
プロだから、小手先で仕事するわけにはいかないのです。わからないなら基礎からちゃんと勉強する義務があります。

でも、むずかしい・・・DOS/Winからきている僕はUNIXの文化をまだ全然知らないと思います。Mac/Linux触って、サーバーも腐るほど作って、やっと体で覚えたけど、やっぱり基礎知識が足りない。
だからこういうことになる。

あきらめない・・・・くそぉ・・・・。

久々に、頭に血が上る思いをしながら、ネットで色々調べて、やっと謎が解けて、このブログを書いています。

今日わかったこと。

【C言語の時とか、PHPの時、ファイルをオープンしたとき、よく”fp”っていう変数に、”ファイルポインタ”が入る、と理解していました。そしてこのファイルポインタを使ってファイルを操作する。ただ、最近みてると”fd”と書かれていたりする、コレは別物だろうか?】

file descriptor of Unix domain socket connected to the client you wish to identify

File Descriptor、つまりファイル識別子、意味は違いそうだが、概ねfpの考えと同じ物であると認識、まずちょっとわかる。

次に、

【http.createServerで生成されたhttp.Serverオブジェクトがlistenしてないのに、なぜ反応する(コンテンツを返す)ことができるのか?】

そうなんです、サンプルとかで、http.createServerをすると、その戻り値のオブジェクトのlistenメソッドを呼び出して初めてポートをリスンします。
なのに、いくつかいろんなサンプルなどをみていると、listen呼び出してないのに、動いてる。

はぁ?!

もう、ずっと追っかけてて、意味わからなくてぶち切れ。

で、ちょっとわかったことが、http.ServerオブジェクトにはAPIに載ってない、listenではなくlistenFDというメソッドがある。
ここで先ほどのFDと話が結びつくんですが、この後ろにつくFD、File Descriptorなんですね。

つまり、ソケットの”fd”イベントというものがあるらしく、そのイベントリスナーに設定することができるようです。
まぁ正確には、fdを引数としてリスンすることができる?のかな?

んで、もう一個。

【node.jsのFunctionオブジェクトには、bindというメソッドが実装されている】

動作は、prototype.jsで実装されているものと同様のようですが。
ようやくするとthisをバインドできる、なんだかExt JSのcreateDelegateみたいな・・・、まぁbindはスコープを固定化させるものです。
apply/callばかりに気がとられていて、何のメソッドだろう・・・としばらく悩みましたが、どうやら関数オブジェクトのメソッドのようです。

上記も、すべて解決したわけではないのですが、調査してやっとここまできました。
いま、シングルプロセスで、Apache Benchを利用して5000 req/s くらいの性能なんですが、マルチスレッドにすれば、20〜50%程度(全然正確なことはわかりませんが)性能向上させられるっぽいので、ともかく実際に試してみる!そしてちゃんと早くなることを確認して、リリースしたいと思います。

なんだか、泥臭いことばっかりやってて、派手なことは何もできてない。なにやってんだ・・・とか、毎日下積みのように、這いつくばってがんばってます・・。

Next JS 0.7.0は仕様もちょっと変わるし、性能も変わりますが、楽しみにしていてくれている人もたくさんいるのは知っています。ただ、僕が天才ではなく、こんな感じで勉強しながらじゃないと作れないので、必死になってがんばってます。

今しばらく、待ってください。

予定通り、夏までには何とかしたいと思っています。

今更ながら、プロセスとかスレッドとか調べ直してみる。