Winsockを使用すると、ソケットを構成したり、I/O操作を分離して「重複」させることができます。つまり、I/Oを実行するための呼び出しはすぐに返されますが、実際の操作は個別のワーカースレッドによって非同期に完了します。
Winsockは「完了ポート」も提供します。私の理解から、完了ポートはハンドル(ソケット)のマルチプレクサとして機能します。ハンドルは、I/O操作の途中でない場合、つまり、すべてのI/O操作がcompletedの場合、逆多重化できます。
だから、私の質問に... Linuxは、完了ポートまたはソケットの非同期I/Oをサポートしていますか?
IOCPとまったく同じものを探している場合は、存在しないため、見つかりません。
Windowsは通知完了モデルを使用します(したがって、I/OCompletionポート)。一部の操作を非同期で開始し、その操作が完了すると通知を受け取ります。
Linuxアプリケーション(および他のほとんどのUnixライク)は、通常、Notify on Readyモデルを使用します。ソケットをブロックせずに読み書きできるという通知を受け取ります。次に、ブロックしないI/O操作を実行します。
このモデルでは、非同期I/Oは必要ありません。データは即座にソケットバッファーにコピーされます/ソケットバッファーからコピーされます。
このためのプログラミングモデルは少しトリッキーです。そのため、libeventのような抽象化ライブラリがあります。シンプルなプログラミングモデルを提供し、サポートされているオペレーティングシステム間の実装の違いを抽象化します。
Windowsにも同様に通知(selectまたはWSAWaitForMultipleEvents)があり、これは以前に見た可能性があります。多数のソケットに拡張できないため、高性能ネットワークアプリケーションには適していません。
WindowsとLinuxはまったく異なるオペレーティングシステムです。 1つのシステムでうまく拡張できないものは、他のシステムでは非常にうまく機能する場合があります。このアプローチは実際にはLinuxで非常にうまく機能し、パフォーマンスはWindowsのIOCPに匹敵します。
IOCPは、さまざまなUNIXプラットフォームでは「非同期I/O」と発音されます。
Boost :: asioを使用します。手を下げて。学習曲線は穏やかですが、クロスプラットフォームであり、コンパイルしているシステムに最適な方法を自動的に使用します。しない理由はありません。
これはあなたの質問に対する答えではないことを知っていますが、私が与えることができる最高のアドバイスです。
Linuxカーネルは、たとえば「blk_complete_request」APIを使用するたびに、「I/Oブロック完了」の概念を提供します。もう一つの例:
http://lxr.free-electrons.com/source/kernel/sched/completion.c
そしてここで説明したように:
http://www.ibm.com/developerworks/library/l-async/
linuxには、同期および非同期の両方のI/Oブロック完了APIがあります。
上記はすべてカーネルレベルです。ユーザースペースレベルには、「io_submit()」APIがあります。
http://www.fsl.cs.sunysb.edu/~vass/linux-aio.txt
io _ *()APIの完全なセットを詳述しています。
部分的に類似した質問:
Boost ASIOは、epoll(Reactorパターン)を使用して、WindowsスタイルのIOCP(Proactorデザインパターン)をLinuxに実装します。参照 http://think-async.com/Asio/asio-1.5.3/doc/asio/overview/core/async.html
Googleのlibevent
のブログエントリを読んでください。Unixで非同期IOを使用してIOCPセマンティクスを実装できますが、非同期IOを使用してセマンティクスを直接実装することはできません。 IOCP、
http://google-opensource.blogspot.com/2010/01/libevent-20x-like-libevent-14x-only.html
クロスプラットフォーム非同期の例については、IO BSDソケットAPIを使用して、LWN.netで最近公開されたZeroMQを見てください。
LWN記事