boost.asio とファイル I/O はどうなるのでしょうか?
-
22-08-2019 - |
質問
boost.asio には、ソケット、シリアル ポート、およびファイル以外のあらゆる種類の例が多数含まれていることに気付きました。Google は、asio が非同期ファイル I/O を実行するための優れたアプローチまたは有効なアプローチであるかどうかについて言及しているものをあまり見つけてきませんでした。
非同期でディスクに書き込みたい大量のデータがあります。これは Windows (私のプラットフォーム) のネイティブのオーバーラップ IO を使用して実行できますが、プラットフォームに依存しないソリューションが望ましいと考えています。
どうか興味があります
- boost.asio はあらゆる種類のファイルをサポートしています
- boost.asio ファイルのサポートは日常的なファイル I/O に十分成熟しています
- ファイルのサポートは追加される予定ですか?この先の見通しはどうなるのでしょうか?
解決
ファイルサポートのboost.asioいずれかの種類をしていますか?
あなたが使用することができます(ASIO 1.2.0が含まれている)1.36ブースト(と思う)を皮切り[ブースト:: ASIO ::] stream_handle窓::またはWindows ::ハンドルをラップし、非同期の読み取りを実行し、メソッドを書くことがrandom_access_handleその上で内部OVERLAPPED構造を使用しているます。
ユーザーLazinもブースト:: ASIO ::窓を言及::非同期操作に使用することができますrandom_access_handle(例えば、名前付きパイプ、だけでなく、ファイル)。
I / Oの?
毎日のファイルのための十分な成熟したboost.asioファイルのサポートです それ自体がBoost.Asioが広く、今で使用され、実装が使用する内部IOを重ね合わせたよう、私はそう言うでしょう。
追加され、これまでのサポートファイルのでしょうか?いただきました!この見通し?
ASIO のウェブサイト上で見つかりませロードマップはありませんとして、私はへの新規追加がないことを言うだろうこの機能のBoost.Asio。 Boost.Asioにコードやクラスを追加する原因の可能性が常にありますが。たぶん、あなたも足りない部分を自分で貢献することができます! : - )
他のヒント
Linux 上の boost::asio ファイル I/O
Linux では、asio は epoll
ソケット/ファイル記述子が読み取り/書き込みの準備ができているかどうかを検出するメカニズム。Linux 上の通常のファイルに対してバニラ ASIO を使用しようとすると、「操作は許可されていません」という例外が発生します。 epoll は Linux 上の通常のファイルをサポートしません.
回避策は、asio が select
Linux 上のメカニズム。定義することでこれを行うことができます BOOST_ASIO_DISABLE_EPOLL
. 。ここでのトレードオフは select は epoll よりも遅くなる傾向があります 多数のオープンソケットを使用している場合。を使用して定期的にファイルを開きます open()
そしてファイル記述子を boost::asio::posix::stream_descriptor
.
Windows 上の boost::asio ファイル I/O
Windowsでは使用できます boost::asio::windows::object_handle
を包む Handle
ファイル操作から作成されたもの。見る 例.
ASIO は、サポートが充実している Windows 上でオーバーラップ I/O をサポートします。Unix では、このアイデアは次の理由で停滞しています。
- ファイルは同じ物理デバイス上にあることが多いため、連続してアクセスすることが望ましいです。
- ファイル要求は物理的に近くにあるため、多くの場合非常に迅速に完了します。
- ファイルは多くの場合、プログラムの基本操作を完了するために重要です (例:設定ファイルの読み取りは、さらに初期化する前に行う必要があります)
一般的な例外の 1 つは、ファイルをソケットに直接提供することです。これは非常に一般的な特殊なケースであり、Linux には カーネル関数 それがあなたのためにこれを処理します。繰り返しになりますが、非同期ファイル I/O を使用する理由は否定されます。
要するに:ASIO は、ほとんどの Unix 開発者によってオーバーラップ I/O が無視されるという、基礎的な OS 設計哲学を反映しているようで、そのプラットフォームではサポートされていません。
ブースト:: ASIO ::窓:: random_access_handleあなたは例えば、高度な何か、非同期LockFileExまたは何か他のものが必要な場合、あなたは、ASIO拡張する独自の非同期イベントが追加される場合があります、これを行うための最も簡単な方法です。 例を郵送の
Linuxは(私はそれを使用しました)この仕事のためのWindowsのAPIよりも使い全く困難ではありませんASIOライブラリを持っています。オペレーティングシステムの両方のセットは、同じ概念アーキテクチャを実装します。彼らは良いライブラリを書くにはなく、あなたは、両方のOSプラットフォーム(私は1つを使用しました)のための共通のインターフェースを持つことができない点に関連する詳細情報が異なってます。
基本的には、非同期ファイルのすべての種類のI / O「フライ・クック」アーキテクチャに従ってください。ここでは、私は読むOPの文脈で意味です:I(処理スレッド)は、ファストフードカウンター(OS)に上がるとチーズバーガー(一部のデータ)を求めます。それは私に私のためのチケット(一部のデータ構造)のコピーを与え、私のハンバーガーを調理する料理人(カーネル&ファイルシステム)に戻すでチケットを発行します。私はその後、座ったり(他の作業を行う)自分の携帯電話を読んで行きます。その後、誰かが私のバーガーは(処理スレッドへの信号)準備ができていると私は私の食べ物(読み取りバッファ)を収集することを発表しました。