web-dev-qa-db-ja.com

boost.asioとファイルI / Oはどうなっていますか?

Boost.asioには、ソケット、シリアルポート、およびあらゆる種類のファイル以外の例を含む多くの例があることに気づきました。 Googleは、asioが非同期ファイルI/Oを実行するための優れたアプローチであるか、有効なアプローチであるかについて言及している私にとって、あまり多くのことを明らかにしていません。

非同期でディスクに書き込みたいデータの塊があります。これは、Windows(私のプラットフォーム)のネイティブオーバーラップioで実行できますが、プラットフォームに依存しないソリューションが必要です。

私は興味があります

  1. boost.asioはあらゆる種類のファイルをサポートしています
  2. boost.asioファイルのサポートは日常のファイルI/Oに十分成熟しています
  3. ファイルサポートは追加されますか?これについての見通しは?
43
Doug T.

Boost.asioはどのような種類のファイルをサポートしていますか?

(私が思うに)Boost 1.36(Asio 1.2.0を含む)から、[boost :: asio ::] windows :: stream_handleまたはwindows :: random_access_handleを使用してHANDLEをラップし、その上で非同期の読み取りおよび書き込みメソッドを実行できます。内部でOVERLAPPED構造を使用します。

ユーザーLazinは、非同期操作(名前付きパイプだけでなく、ファイルなど)に使用できるboost :: asio :: windows :: random_access_handleについても言及しています。

Boost.asioファイルのサポートは日常のファイルI/Oに十分成熟していますか?

Boost.Asio自体は現在広く使用されており、実装では重複したIOを内部的に使用しているため、「はい」と言えます。

ファイルサポートは追加されますか?これについての見通しは?

Asio Webサイトにロードマップが見つからないため、この機能のためにBoost.Asioに新たに追加されることはないと思います。寄稿者がBoost.Asioにコードとクラスを追加する可能性は常にありますが。足りない部分を自分で貢献できるかもしれません! :-)

18
vividos

Linux上のboost :: asioファイルI/O

Linuxでは、asioは epoll メカニズムを使用して、ソケット/ファイル記述子が読み取り/書き込みの準備ができているかどうかを検出します。 Linuxの通常のファイルでVanillaasioを使用しようとすると、 epollはLinuxの通常のファイルをサポートしていません であるため、「操作は許可されていません」という例外が発生します。

回避策は、Linuxで select メカニズムを使用するようにasioを構成することです。これを行うには、_BOOST_ASIO_DISABLE_EPOLL_を定義します。ここでのトレードオフは selectはepollよりも遅くなる傾向があります 多数の開いているソケットで作業している場合。 open()を使用して定期的にファイルを開き、ファイル記述子を _boost::asio::posix::stream_descriptor_ に渡します。

Windowsでのboost :: asioファイルI/O

Windowsでは、 _boost::asio::windows::object_handle_ を使用して、ファイル操作から作成されたHandleをラップできます。 を参照してください。

6
moof2k

ASIOは、サポートが良好なWindowsでオーバーラップI/Oをサポートします。 Unixでは、このアイデアは次の理由で停滞しています。

  • 多くの場合、ファイルは同じ物理デバイス上にあるため、順番にアクセスすることをお勧めします。
  • ファイル要求は、物理的に近くにあるため、非常に迅速に完了することがよくあります。
  • 多くの場合、ファイルはプログラムの基本的な操作を完了するために重要です(たとえば、構成ファイルの読み取りは、さらに初期化する前に行う必要があります)

一般的な例外の1つは、ファイルをソケットに直接提供することです。これは非常に一般的な特殊なケースであり、Linuxにはこれを処理するカーネル関数があります。繰り返しますが、非同期ファイルI/Oを使用する理由を否定します。

つまり、ASIOは基本的なOS設計哲学を反映しているようであり、重複したI/OはほとんどのUnix開発者によって無視されているため、そのプラットフォームではサポートされていません。

5
unixman83

boost :: asio :: windows :: random_access_handleはこれを行う最も簡単な方法です。たとえば、非同期LockFileExなどの高度なものが必要な場合は、asioを拡張し、独自の非同期イベントを追加できます。

4
Evgeny Lazin

Linuxには、このジョブにWindows APIよりも使いにくいasioライブラリがあります(私はそれを使用しました)。オペレーティングシステムの両方のセットは、同じ概念アーキテクチャを実装しています。これらは、優れたライブラリの作成に関連する詳細が異なりますが、両方のOSプラットフォームに共通のインターフェイスを使用できないという点ではありません(私は1つを使用しました)。

基本的に、非同期ファイルI/Oのすべてのフレーバーは「FryCook」アーキテクチャに従います。 Read opのコンテキストでの意味は次のとおりです。私(処理スレッド)はファーストフードカウンター(OS)に行き、チーズバーガー(いくつかのデータ)を要求します。それは私の注文チケットのコピー(いくつかのデータ構造)を私に与え、私のハンバーガーを調理するために料理人(カーネルとファイルシステム)に戻ってチケットを発行します。次に、座ったり、電話を読んだりします(他の作業を行います)。後で、誰かが私のハンバーガーの準備ができたことを発表し(処理スレッドへの信号)、私は食べ物を集めます(読み取りバッファー)。

1
Zack Yezek