42

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

せいぜい私は何かを意味します...

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

4 に答える 4

45

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

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

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

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

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

于 2008-09-15T22:23:39.067 に答える
5

libuv

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

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

于 2013-04-16T10:26:42.527 に答える
2

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

現在の障害:

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

プロジェクトの進捗状況に応じて、この投稿を更新する予定です。

http://sourceforge.net/projects/cpoll

于 2008-09-15T22:13:33.227 に答える
0

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

于 2012-08-02T10:30:40.527 に答える