epoll / devpoll / kqueue / poll / select(windows-selectを含む)を使用して、非同期ソケットIOのイベントループを設計しています。
IO操作を実行するための2つのオプションがあります。
非ブロッキングモード、EAGAINでポーリング
- ソケットを非ブロッキングモードに設定します。
- ソケットへの読み取り/書き込み。
- 操作が成功した場合は、完了通知をイベントループに送信します。
- EAGAINを取得した場合は、「選択リスト」にソケットを追加し、ソケットをポーリングします。
ポーリングモード:ポーリングしてから実行します
- ソケットを追加してリストを選択し、ポーリングします。
- 読み取り可能で書き込み可能であるという通知を待つ
- 読み書き
- sucseedsのイベントループへの完了通知の投稿
私には、通常モードで使用する場合、特にソケットへの書き込みの場合、最初に必要なシステムコールが少なくなるように見えます(バッファーは非常に大きい)。また、「select」実行の数よりもオーバーヘッドを減らすことができるように見えます。特に、epoll / devpoll/kqueueのように拡張性の高いものがない場合に便利です。
質問:
- 2番目のアプローチの利点はありますか?
- Linux、FreeBSD、Solaris、MacOSX、Windowsなどの多数のオペレーティングシステムでのソケット/ファイル記述子の非ブロッキング操作に移植性の問題はありますか?
注:既存のevent-loop/socket-api実装の使用を提案しないでください