kqueue()によって返されるkeventのファイル記述子は、select()またはkevent()への入力として使用できます。
この方法を使用する利点は何ですか?
kevent()を使用して記述子のリストを待機していて、そのリストにいくつかのアクティビティがあるとします。keventのファイル記述子が設定され、select()またはkevent()で読み取り可能になりますか?
OSX/BSD の場合 - kevent は、Windows I/O Completion Port モデルまたは Linux epoll モデルと同等の bsd/osx スケーラビリティ ソリューションです。
それに慣れると、シンプルさと柔軟性の点で他のモデルよりも好きだと思います。API は端が少し荒いですが。
この選択の主な利点は、スケールです。select() は、多数のファイル ハンドルで使用する場合、効率的にセットアップおよび破棄するために多くのトリックやハックを必要とし、ファイル ハンドルの数はしばしば制限されます。poll() はファイル ハンドル数の制限を取り除きますが、セットアップ/ティアダウンの問題はまだあります。OSX ではネイティブに使用できません。
コンテキスト切り替えの改善について議論したいと思います。これは、特に新しい Vista API と OS スレッド プールを使用している場合に、Windows IOCP に当てはまります。OSX ではそれが正しいと思いますが、絶対的な例を挙げるのは難しいでしょう。
柔軟性のために、ハンドルを簡単に登録して kqueue から削除できると便利です。しかし、それは便利です。kevent の本当に優れた点は、ファイル ハンドルではないものと関連付けることができることです。私はこれを、すべてがファイル ハンドルでなければならない epoll ソリューションよりも好みます。そうです、これは UNIX のマントラです。
ファイル記述子の kevents 非要件により、ファイルの読み取り、書き込み、属性の変更、削除、名前の変更を具体的に監視できます。プロセスの終了、フォーク、シグナル。(bsd ではなく) mach ポートでのイベント。タイマー、およびユーザー イベント。
コールバック ハンドラを使用して、複数のスレッドで実行される 1 つの API からこれらすべての種類のイベントを処理できると非常に便利です。
これは (1) に対する非常に長々とした答えでした。
(2)は; 私は上手く理解できていない気がします。ファイル記述子が両方で保留されている場合、単一の「トリガーアクティビティ」が kevent と select をトリップさせると思います。
ますます関連性が低くなってきている 1 つの警告。OSX 10.5.x の kevent は信頼性に欠けます。予想されるイベントの一部はサポートされておらず、動作のドキュメントが曖昧であるため、いくつかのバグやエラッタがある可能性があります。など... keventで待機中にソケット/記述子を閉じると、場合によってはkeventがトリガーされない場合があります。私が見た限りでは、kevent は OSX の Grand Central Dispatch の基盤となるテクノロジーであり、10.6 以降では実際に改善されています。