15

オーバーラップ I/O の使用方法に関するチュートリアルしか見つかりませんが、なぜそのように呼び出されるのかわかりません。

たとえば、ソケットから何かを読み取ってから、最初の読み取りが読み取ったバイトを返す前に別のものを読み取ることができるためですか?

4

3 に答える 3

14

古典的な意味は 1960 年代 (またはそれ以前) にまでさかのぼります。重複した I/O とは、複数の I/O 転送 (通常は異なるデバイスへの各 I/O) が同時に発生する可能性があることを意味していました (テープからの同時読み取りと書き込みなど)。ディスクへ)。これの別の古典的な名前は、同時 I/O でした。これは、割り込みや DMA に似たハードウェアを介して実現できます (当時、DMA ハードウェアの実装の一部は、小さなプロセッサのセットに似ていました)。

IBM メインフレームの記事の例:

オーバーラップ I/O - IBM

于 2015-02-22T15:59:18.830 に答える
8

(20 年前) は、IO を開始し、計算やその他の作業を実行し、後で結果を待つことができるという考えだったと思います。これが今日行われることはめったにありません。selectこのアイデアは、とpollが最先端と見なされていた時代から来ていると思います。

より適切な名前は、非同期 IO です。それは、他のすべてのプラットフォームがそれを呼んでいるようです. 実際、MSDN のドキュメントでは 2 つの用語が混在しています。

于 2015-02-22T12:34:57.023 に答える
5

Microsoft Windows でのオーバーラップ操作は、他のすべての OS 言語での非同期として他に何も意味しません。

あなたの例に固執するために、ソケットで読み取りを開始し、成功を待つのではなく、まったく異なることを行います(おそらく別の(!)ソケットで読み取ります)。次に、最初の操作が終了したかどうかを尋ねます。そのためのイベントハンドルを設定することもできます。または、CALLBACK完了時に呼び出される関数を指定します。その場合、最初の呼び出しが残りの操作と「重複」しています。

ウィキペディアも見てください。

マイクロソフトがそれをオーバーラップと呼んでいる(だった)理由は、スレッドを開始するようなものではなく、標準的な名前がなかったときに非同期タスクを開始するようなものだからだと思います。std::asyncよりも似ていstd::threadます。

于 2015-02-22T12:35:05.307 に答える