問題タブ [aio]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - POSIX 非同期 I/O (AIO) のステータスは?
Web には、POSIX AIO 機能をさまざまな詳細で説明しているページが散在しています。それらのどれもひどく最近のものではありません。彼らが正確に何を説明しているのかは明らかではありません。たとえば、ここの Linux カーネル非同期 I/O サポートの「公式」(?) Web サイトは、ソケットが機能しないと述べていますが、私の Ubuntu 8.04.1 ワークステーションの「aio.h」マニュアル ページはすべて、それを暗示しているようです。任意のファイル記述子に対して機能します。次に、ドキュメントがさらに少ないライブラリ層で動作するように見える別のプロジェクトがあります。
知りたい:
- POSIX AIO の目的は何ですか? 私が見つけることができる実装の最も明白な例がソケットをサポートしていないと言っていることを考えると、全体が奇妙に思えます。非同期ディスク I/O のためだけですか? もしそうなら、なぜ超汎用 API なのですか? そうでない場合、ディスク I/O が最初に攻撃されたのはなぜですか?
- 私が見ることができる完全なPOSIX AIOプログラムの例はどこにありますか?
- 誰かが実際にそれを実際に使用していますか?
- POSIX AIO をサポートするプラットフォームは? 彼らはどの部分をサポートしていますか?
<aio.h>
約束しているように見える暗黙の「任意の FD への任意の I/O」を本当にサポートしている人はいますか?
私が利用できる他の多重化メカニズムは完全に優れていますが、そこに浮かぶ情報のランダムな断片に興味をそそられました。
linux - LinuxでPOSIXAIOlibを使用してC++プログラムをコンパイルする
LinuxでPOSIXaioライブラリ(aio_read()、aio_write()など)を使用するサンプルプログラムをコンパイルする場合、リンカーに問題があります。
私は2.6カーネルでUbuntuを実行しており、apt-getユーティリティを使用してlibaioをインストールしました。ただし、aioライブラリとリンクしている場合でも、コンパイラによってリンカーエラーが発生します。
ライブラリlibaio.aにない場合、これらすべてのaio_x関数は実際にどこで定義されていますか?
linux - POSIX AIO ライブラリとコールバック ハンドラ
aio_read/write に関するドキュメントによると、AIO ライブラリが非同期ファイル I/O 操作が完了したことをアプリケーションに通知する方法は基本的に 2 つあります。1) シグナルを使用できる、2) コールバック関数を使用できる
コールバック関数はシグナルよりもはるかに優れており、おそらく高レベルのマルチスレッド ライブラリに統合する方がはるかに簡単だと思います。残念ながら、この機能のドキュメントは控えめに言ってもめちゃくちゃです。sigevent 構造体のマニュアル ページなどの一部の情報源は、sigevent 構造体の sigev_notify データ メンバーを SIGEV_CALLBACK に設定してから、関数ハンドラーを提供する必要があることを示しています。おそらく、ハンドラーは同じスレッドで呼び出されます。他のドキュメントでは、sigev_notify を SIGEV_THREAD に設定する必要があることが示されています。これにより、新しく作成されたスレッドでコールバック ハンドラが呼び出されます。
いずれにせよ、私の Linux システム (カーネル 2.6.28 の Ubuntu) では、SIGEV_CALLBACK はどこにも定義されていないようですが、SIGEV_THREAD は宣伝どおりに機能します。残念ながら、コールバック ハンドラーを呼び出すために新しいスレッドを作成するのは、特に多くのハンドラーを呼び出す必要がある場合、非常に効率が悪いようです。ほとんどのネットワーク I/O イベント デマルチプレクサが動作する方法と同様に、既存のスレッド プールを使用することをお勧めします。QNX などの UNIX の一部のバージョンには SIGEV_SIGNAL_THREAD フラグが含まれており、指定された既存のスレッドを使用してハンドラーを呼び出すことができますが、これは Linux では使用できないようであり、POSIX の一部でさえないようです。標準。
それで、ハンドラーが呼び出されるたびに新しいスレッドを作成/破棄するのではなく、事前に割り当てられたバックグラウンドスレッド/スレッドプールでユーザーハンドラーを呼び出す方法で POSIX AIO ライブラリを使用することは可能ですか?
linux - 単一のイベントループでAIOとepollをどのように一緒に使用しますか?
AIOとepollを1つのイベントループに組み合わせるにはどうすればよいですか?
グーグルは2002年と2003年からそれらを統合することについて多くの話を見つけますが、何かが起こったかどうか、またはそれが可能かどうかは不明です。
誰かがaio信号にeventfdを使用してepollループで自分自身をロールバックしましたか?
posix - 「aioとepollをどのように併用するか」を再考する
での議論に続いて、単一のイベントループでAIOとepollをどのように一緒に使用しますか?。
実際、Linuxには2つの「aio」APIがあります。posIX aio(aio_ *ファミリーの関数)があります。これは、io_ *ファミリーであるRedHat(?)によって開発されたglibcとlibaioに含まれています。
1つ目は、aio_sigeventaiocbメンバーを介した通知要求の登録を許可します。これは、ppoll()/ pselect()イベントループと簡単に統合できます。POSIX aioをepoll()と統合する場合は、信号をダミーfd(パイプなど)のイベントに変換し、epollでリッスンする必要があります。その間、従来の方法またはppoll/で信号をキャッチします。選択する。最初の選択肢(通常のシグハンドラー)の安全性は、アプリケーションによって異なります。そして多分epollにありますが、私はその内部を完全には認識していません。私がepollベースのアプリを持っていて、POSIX aioサポートを追加したい場合、私は困惑していると安全に想定できますか?これが私の質問でした。
2番目のAIO実装であるlibaioは、実際にeventfd()で使用できます(ゼロであると予想されるaio_resfdメンバーまたはAIO結果を配信するeventfdを持つstruct iocb)。しかし、それは本によるものではありません。POSIX指定、つまり。
私は自分がすべてが明確な*BSDユーザーになることを夢見ています。AIOイベントに対するPOSIXAIOおよびkqueue()のサポートがあります。クリスタルクリア。他の多くのものと同じように。
c++ - OSXとLinuxのAIO-MacOSX10.6で動作しない理由
私の質問は本当に簡単です。以下のコードがLinuxで機能し、Mac OS X 10.6.2SnowLeopardでは機能しない理由。
コンパイルするには、ファイルをaio.ccに保存し、g++ aio.cc -o aio -lrt
LinuxおよびMacOSXでコンパイルしますg++ aio.cc -o aio
。MacでのテストにはMacOSX 10.6.2を使用し、LinuxでのテストにはLinuxカーネル2.6を使用しています。
OS Xで見られる失敗は、aio_writeが-1で失敗し、errnoをEAGAINに設定します。これは、単に「リソースが一時的に利用できない」ことを意味します。何故ですか?
更新(2010年2月):OSXはソケットでAIOをまったくサポートしていません。バマー!
multithreading - I/O Completion ポート (Windows) または非同期 I/O (AIO) は、大量の要求を処理するマルチスレッド サーバーのパフォーマンスを向上させますか?
Windows では I/O Completion ポートを使用し、solaris および Linux バージョンのサーバー アプリケーションでは非同期 I/O (AIO) を使用したいと考えています。アプリケーション サーバーはマルチスレッド化されており、多数の同時 TCP 接続を受け入れることができ、接続ごとに多くの要求を処理できます。この基準は、最新の AIO を使用するのに十分ですか? どの 1 つのコードをすべてのプラットフォームで使用できるかを使用した標準化はありますか?
ありがとう、ナガ
c - Linux での AIO ネットワーク ソケットとゼロコピー
私は非同期の Linux ネットワーク ソケット (aio.h/librt の aio_read など) を試してきました。これまでに読んだほとんどすべてがファイル I/O について説明していますが、そのネットワーク I/O には興味があります。
AIO は使用するのが少し面倒で、移植性がないと思われるので、それを使い続ける価値があるかどうか疑問に思っています。ゼロコピーは、(非ブロッキングの)select/epoll..よりも優れている唯一の利点です(私の目的では主要なものですが)。
c - Posix AIO が悪い/壊れている?
私は、複雑なマルチスレッド実装から、ステートマシンを使用して接続されているセッションの状態を追跡するシングルスレッド/シングルプロセス実装に移行する TFTP 実装に取り組んでいます。TFTP は十分に単純であり、同時セッションの数が十分に少ないため、コード サイズと複雑さを大幅に節約する以外に、ソフトウェアへの影響は実際にはありません。
もちろん、他のセッションが接続されているときに、1 つのセッションだけをブロックすることはできません。これを改善するために、私の最初の考えは POSIX AIO でしたが、いくつかの調査の結果、それは
- 不十分に文書化されており、完全ではありません
- ディスク I/O でのみ動作し、ソケットをサポートしないか、ソケットで動作するが読み取り/書き込みのみ - リスニング用ではありません。
このリンク ( http://davmac.org/davpage/linux/async-io.html ) に例が含まれていますが、他にも見つけました。'08の以前の stackoverflow の投稿 ( POSIX 非同期 I/O (AIO) のステータスとは? ) で、いくつかの追加の視点が提供されました。
C 開発者にとって、AIO は人々が主張するほどまだ壊れているのでしょうか? 人々は本当に AIO を使用せず、主にポーリング/選択または有限サイズのスレッド プールに固執しますか?
linux - Linux 2.6.x の aio に関する最新情報はどこで入手できますか?
最近、高性能な Web サーバーの書き方を学んでいます。epoll は aio よりも速いという RedHat の実験があります。Linuxカーネルのaioがpthreadで実装されているため、誰かがそれを言います。これを証明する最新情報を見つけるのは難しいです。また、Linux で epoll が現在 aio よりも優れているかどうかもわかりません。Linux 2.6.x での aio に関する最新情報はどこで入手できるか知りたいです。ありがとう!