flat7th

memo/20070305

created 2007-03-05 modified 2007-03-05 

以前、LinuxというかUnix系で、selectを共通ライブラリで行って各プログラムにやらせない、という方針で成功しているライブラリを見た。ファイルも標準入出力もソケットも、全部共通化して扱えて、使いやすいうえに、シングルスレッドポリシーで貫かれたライブラリであり動作がとても速かった。

Windowsならどうやればうまくいくのか、と最近考えている。

ためしにselectを調べると、WindowsではselectはWinSockの一部として実装されており、標準入出力やファイルを共通に扱えない。
それにWinSockのselectはファイルデスクリプタをゼロ個渡すような使い方はエラーとなってしまうし、rfdとwfdだけでなくefdも使わないと取得できない情報があるし、帰ってきたFDの数がゼロなのにタイムアウトじゃないことがある。端的に行ってUnix系との互換性が非常に悪く、意図したように使えない。

Windows界では非同期I/Oという用語がよく出てくるが、これはバッファの使い方(ライブラリインタフェース)がselect方式とは大きく異なる。
どうも、MSDNライブラリでは非同期I/Oと、同期的だが非ブロッキングなI/O(Unix系でselectでできること)とが混同されていて、それが無用な混乱を招いている気がする。

Windows界の「非同期I/O」は、Unix系での「シグナル駆動I/O」に近いのかも。

Unix系がTCP/IPレイヤやカーネルレイヤでやっていることまで含めれば、同じようなことはできる気がしてきたけど、selectだけじゃなくてopenとかread,writeに相当する処理もラッパを用意しないとだめポ。
また、使うAPIはselectよりWaitForXXXObjects、.netならWaitHandleクラスのほうが適切っぽい。

それならいっそ、selectじゃなくてepollのインタフェースを参考にはできまいか。

調べているときこれに当たったのでちょっとメモ。

リンク備考
userver projectuはマイクロ(μ)の意味らしい