web-dev-qa-db-ja.com

Windowsで最高のepoll / kqueue / select同等物は何ですか?

Windowsの最高のI/Oイベント通知機能は何ですか?

せいぜい私が意味することは...

  1. 入力ファイル記述子の数に制限はありません
  2. すべてのファイル記述子(ディスクファイル、ソケットなど)で機能します
  3. さまざまな通知モードを提供します(エッジトリガー、制限トリガー)
35
blackwing

Windowsでは、非同期操作は記述子ではなくファイル操作によって実行されます。ファイル操作が非同期で完了するのを待つ方法はいくつかあります。

たとえば、データがネットワークソケットでいつ利用可能になるかを知りたい場合は、ソケットで非同期読み取り要求を発行し、それが完了すると、データが利用可能になり、取得されました。

Win32では、非同期操作は OVERLAPPED 構造を使用して、未処理のIO操作に関する状態を含みます。

  1. ファイルを IO完了ポート に関連付け、非同期IO要求をディスパッチします。操作が完了すると、ワーカースレッドのキューに完了メッセージが配置されます。 )到着時に待機して取得できます。ユーザー定義のメッセージをキューに入れることもできます。完了ポートで使用できるファイルまたはキューに入れられたメッセージの数に制限はありません。
  2. 各IO操作をイベントとともにディスパッチします。操作に関連付けられたイベントは、完了すると通知されます(待機を満たします)。 WaitForMultipleObjects を使用してすべてのイベントを一度に待機します。これには、_MAXIMUM_WAIT_OBJECTS_オブジェクトを一度にしか待機できないという欠点があります(64)。他のタイプのイベントを同時に待機することもできます(プロセス/スレッドの終了、ミューテックス、イベント、セマフォ)
  3. スレッドプール を使用します。スレッドプールは、無制限の数のオブジェクトとファイル操作を待機して、それぞれの完了時に ユーザー定義関数 を実行できます。
  4. ReadFileExおよび WriteFileEx を使用して、呼び出し元のスレッドに 非同期プロシージャ呼び出し (APC)をキューに入れ、 SleepEx (または_WaitFor{Single|Multiple}ObjectsEx_)と_Alertable TRUE_を組み合わせて、操作の完了時に各操作の通知メッセージを受信します。このメソッドはIO完了ポートに似ていますが、1つのスレッドに対してのみ機能します。

Windows NTカーネルは、ソケット、ディスクファイル、パイプなどのファイル操作を内部的に区別しません。これらのオプションはすべて、すべてのファイルタイプで機能します。

40
Chris Smith

libuv

libuvは、UnixおよびWindowsのイベントI/Oを提供し、ソケット、ファイル、パイプをサポートしています。 Node.jsのプラットフォーム層です。

詳細は以下にあります http://nikhilm.github.io/uvbook/introduction.html

4
schlamar

私の知る限り、まだありません。友人と私はオープンソースのWindowsepoll実装(以下のリンク)に取り組んでいますが、Linux実装と同じように動作させる方法を見つけるのに問題が発生しています。

現在の障害:

  • Linuxでは、ファイル記述子とソケット記述子は交換可能ですが、Windowsでは互換性がありません。どちらもepoll実装と互換性がある必要があります。
  • Windowsでは、カーネルイベントを取得するのは非常に困難です... Linuxでepollが機能する方法です。クロスプラットフォームのepollライブラリを使用するプログラムは、WindowsではLinuxよりも著しく遅くなると推測しています。

プロジェクトが進行するにつれて、この投稿に戻って更新しようと思います。

http://sourceforge.net/projects/cpoll

1
Heron

select()関数はPOSIXであり、「winsock.h」または「winsock2.h」を含むウィンドウで使用できます。

0
Nouil