16

しばらくの間、私は nix マシンで非同期プログラミング/動作を達成するためのさまざまな方法について知るために多くのことをグーグルで調べてきましたが、(以前に知っていたように) 真の非同期パターン (同時実行性) がまだ存在しないという事実が確認されました。 Windows (IOCP) で使用できるように、Linux ではシングル スレッドを使用します。

以下は、Linux に存在するいくつかの代替手段です。

  1. select/poll/epoll :: epoll がまだ呼び出しをブロックしているため、シングル スレッドを使用して実行することはできません。また、監視対象のファイル記述子は、非ブロッキング モードで開く必要があります。
  2. libaio :: 私が知ったのは、その実装がうまくいかず、Windows I/O 完了ポートのように完了ベースではなく、依然として通知ベースであるということです。
  3. Boost ASIO :: Linux で epoll を使用するため、proactor デザイン パターンを達成するためにユーザー コードから完全に抽象化されたスレッドを生成するため、真の非同期パターンではありません。
  4. libevent :: ASIO の方が好きなのですが、それを選ぶ理由はありますか?

ここに質問があります:)

  1. epoll を使用して高速でスケーラブルなネットワーク サーバーを作成するための最適な設計パターンは何でしょうか (もちろん、ここではスレッドを使用する必要があります :( )
  2. 「ノンブロッキングモードではソケットのみを開くことができる」とどこかで読んだことがあります。したがって、epoll はソケットのみをサポートするため、ディスク I/O には使用できません。上記の説明はどの程度正しいのでしょうか? また、 epoll を使用してディスク I/O で非同期プログラミングを実行できないのはなぜですか?
  3. Boost ASIO は、epoll 呼び出しの周りに 1 つの大きなロックを使用します。その意味と、asio自体を使用してそれを克服する方法を実際には理解していませんでした。同様の質問
  4. ディスク ファイルで動作するように ASIO パターンを変更するにはどうすればよいですか? おすすめのデザインパターンはありますか?

誰かが素晴らしい説明ですべての質問に答えることができることを願っています. epoll および AIO 設計パターンの実装の詳細が説明されているソースへのリンクも歓迎します。

4

2 に答える 2

12

Boost ASIO :: Linux で epoll を使用するため、proactor デザイン パターンを実現するためにユーザー コードから完全に抽象化されたスレッドを生成するため、真の非同期パターンではありません。

これは正しくありません。Asio ライブラリはepoll()、最新の Linux カーネル バージョンでデフォルトで使用します。ただし、呼び出すスレッドは、io_service::run()必要に応じてコールバック ハンドラを呼び出します。Asio ライブラリには、非同期インターフェイスをエミュレートするためにスレッドが使用される場所が 1 か所しかありません。ドキュメントで詳しく説明されています。

非同期ホスト解決をエミュレートするために、io_service ごとに追加のスレッドが使用されます。このスレッドは、 ip::tcp::resolver::async_resolve()または の最初の呼び出しで作成されますip::udp::resolver::async_resolve()

あなたが主張するように、これはライブラリを「真の非同期パターンではない」ものにしません。実際、その名前は定義によりあなたと一致しません。

1) epoll を使用して高速でスケーラブルなネットワーク サーバーを作成するための最適な設計パターンは何でしょうか (もちろん、ここではスレッドを使用する必要があります :( )

Boost Asio を使用することをお勧めします。proactor デザイン パターンを使用します。

3) ブースト ASIO は、epoll 呼び出しの周りに 1 つの大きなロックを使用します。その意味と、asio自体を使用してそれを克服する方法を実際に理解していませんでした

epoll リアクターはミューテックスを使用してハンドラーをディスパッチしますが、実際にはこれはほとんどのアプリケーションにとって大きな問題ではありません。io_serviceCPU ごとにデータの局所性を活用するなど、この動作を軽減するアプリケーション固有の方法があります。このトピックに関する同様の質問に対する私の回答を参照してください。また、 Asio メーリング リストでも頻繁に議論されています。

4) ディスク ファイルで動作するように ASIO パターンを変更するにはどうすればよいですか? おすすめのデザインパターンはありますか?

ご指摘のとおり、Asio ライブラリはファイル I/O をネイティブにサポートしていません。これをライブラリに追加する試みがいくつかありました。メーリング リストで議論することをお勧めします。

于 2012-01-08T13:06:05.560 に答える
2

初めに:

Windows(IOCP)で利用可能なLinux用のTRULY非同期パターン(シングルスレッドを使用した同時実行)がまだないという事実を確認しました。

あなたはおそらく小さな誤解を持っています.非同期は「ポーリング」APIの上に構築できます。

さらに、その「リアクター」(epoll のような) API は「プロアクター」API (IOCP) よりも強力です。これは、2 番目の API が最初の API の観点から実装できるためです (ただし、その逆はできません)。

また、ディスク I/O などの「真に」非同期な操作や、信号の組み合わせを使用できる他のツールや、Linux 固有signalfdのいくつかの他のケースを完全にカバーすることができる操作もあります。

結論。epoll真の非同期 I/O です

于 2012-01-08T13:26:34.013 に答える