42

winsock を使用すると、ソケットを構成したり、I/O 操作を「オーバーラップ」するように分離したりできます。つまり、I/O を実行するための呼び出しはすぐに返されますが、実際の操作は個別のワーカー スレッドによって非同期に完了します。

Winsock は「完了ポート」も提供します。私が理解していることから、完了ポートはハンドル (ソケット) のマルチプレクサとして機能します。ハンドルが I/O 操作の途中でない場合、つまりすべての I/O 操作が完了している場合、ハンドルを逆多重化できます。

それで、私の質問に... Linux はソケットの完了ポートまたは非同期 I/O をサポートしていますか?

4

6 に答える 6

86

IOCP とまったく同じものを探している場合、存在しないため、見つかりません。

Windows は、完了モデルの通知を使用します (したがって、I/O完了ポート)。何らかの操作を非同期で開始し、その操作が完了すると通知を受け取ります。

Linux アプリケーション (および他のほとんどの Unix 系アプリケーション) は、通常、準備完了モデルの通知を使用します。ソケットをブロックせずに読み書きできるという通知を受け取ります。次に、ブロックしない I/O 操作を実行します。

このモデルでは、非同期 I/Oは必要ありません。データはすぐにソケット バッファに/からコピーされます。

このためのプログラミング モデルはややこしいので、libevent のような抽象化ライブラリが存在します。より単純なプログラミング モデルを提供し、サポートされているオペレーティング システム間の実装の違いを抽象化します。

Windows にも通知モデル (select または WSAWaitForMultipleEvents) があり、以前に見たことがあるかもしれません。多数のソケットに拡張できないため、高性能ネットワーク アプリケーションには適していません。

Windows と Linux はまったく異なるオペレーティング システムです。あるシステムではうまくスケーリングできないものでも、別のシステムではうまく機能する場合があります。このアプローチは、実際には Linux で非常にうまく機能し、パフォーマンスは Windows の IOCP に匹敵します。

于 2010-05-12T17:02:16.947 に答える
23

IOCP は、さまざまな UNIX プラットフォームで「非同期 I/O」と発音されます。

于 2010-05-08T15:23:31.633 に答える
10

Use boost::asio. Hands down. It has a mild learning curve, but it's cross-platform, and automatically uses the best available method for the system you're compiling on. There's simply no reason not to.

I know that this isn't quite an answer to your question, but it's the best advice I could give.

于 2011-08-19T17:40:50.747 に答える
7

それで、私の質問に... Linux はソケットの完了ポートまたは非同期 I/O をサポートしていますか?

ソケットに関しては、5.3 以降のカーネルでは、 Linux には ( 5.1 カーネルで登場したファイル/ブロック デバイスのサポート用に)の形をした完了ポートに類似したものがあります。io_uringio_uring

于 2020-04-28T05:12:26.773 に答える
0

Boost ASIOは、epoll(Reactorパターン)を使用してLinux上にWindowsスタイルのIOCP(Proactorデザインパターン)を実装します。http://think-async.com/Asio/asio-1.5.3/doc/asio/overview/core/async.htmlを参照してください

于 2012-08-22T19:32:56.730 に答える
0

Google のブログ エントリを読んでください。libevent非同期 IO を使用して Unix に IOCP セマンティクスを実装できますが、IOCP を使用して非同期 IO セマンティクスを直接実装することはできません。

http://google-opensource.blogspot.com/2010/01/libevent-20x-like-libevent-14x-only.html

BSD ソケット API を使用したクロスプラットフォーム非同期 IO の例については、LWN.net で最近公開された ZeroMQ を参照してください。

http://www.zeromq.org/

LWN記事、

http://lwn.net/Articles/370307/

于 2010-05-10T04:30:22.043 に答える