問題タブ [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 AIO:完了通知を元のリクエストに関連付ける(良い)方法はありますか?
AIO完了通知(スレッドまたはシグナルを介して行われるかどうかに関係なく)は、どの要求が完了したかについての情報を提供しないと私は考えていますか?リクエストごとに個別のコールバック関数を呼び出す以外に、この相関関係を実現する方法はありますか?表面上は、元のリクエストのaiocb構造を使用して、aio_errorおよびaio_returnを呼び出すことができますが、通知コールバックの一部としてaiocb構造へのポインターを取得することはできません。なぜこれを行うメカニズムがないように見えるのですか?
c++ - C++での非同期処理
永久に実行され、リクエストを処理するサーバーには、データベースクエリを実行し、新しい変更があった場合にのみ更新するコードの非同期部分が必要です。サーバーは永久に実行する必要があり、db関数を繰り返し実行するためのこの関数は非同期で実行する必要があるため、「x」分ごとに1回更新されるため、サーバーに支障をきたすことはありません。
これをC++で非同期的に処理するにはどうすればよいでしょうか。サーバーをまったくブロックしないように、その関数をデーモンで実行するように単独で設定するにはどうすればよいですか?
c++ - Linux 非同期 IO と libaio のパフォーマンスの問題
サーバーアプリケーションで最適化されたIOパフォーマンスのためにLinux libaioを試しています。必要なことはすべて完了したと思います(O_DIRECTを使用して、バッファをメモリページに合わせます...)。私は io_submit への呼び出しがすぐに返されることを期待していますが、コア i7 ラップトップで返されるのに実際に約 80 マイクロ秒かかることを示す簡単なテストです。期待しすぎているのでしょうか、それともテスト プログラムに何か問題があるのでしょうか? ( g++ --std=c++0x -laio でコンパイル)
linux - LinuxでのPOSIX AIOとlibaioの違いは?
私が理解しているように見えること:
POSIX AIO
API は でプロトタイプ化され<aio.h>
、プログラムは librt(-lrt) でリンクされますが、libaio
API<libaio.h>
とプログラムは libaio (-laio) でリンクされます。
私が理解できないこと:
1.カーネルは、これらの方法のいずれかを異なる方法で処理しますか?
2.O_DIRECT
どちらかを使用する場合、フラグは必須ですか?
この投稿で述べたように、libaio はO_DIRECT
使用しなくても正常に動作しますlibaio
。
R.Love のLinux System Programming book によると、Linux は通常のファイルでaio (これは POSIX AIO だと思います) をサポートするのは、で開いた場合のみです。フラグなしで開いたファイルは問題なく動作します。O_DIRECT
aio_write
O_DIRECT
c++ - *nix での非同期プログラミングの基礎を理解する
しばらくの間、私は nix マシンで非同期プログラミング/動作を達成するためのさまざまな方法について知るために多くのことをグーグルで調べてきましたが、(以前に知っていたように) 真の非同期パターン (同時実行性) がまだ存在しないという事実が確認されました。 Windows (IOCP) で使用できるように、Linux ではシングル スレッドを使用します。
以下は、Linux に存在するいくつかの代替手段です。
- select/poll/epoll :: epoll がまだ呼び出しをブロックしているため、シングル スレッドを使用して実行することはできません。また、監視対象のファイル記述子は、非ブロッキング モードで開く必要があります。
- libaio :: 私が知ったのは、その実装がうまくいかず、Windows I/O 完了ポートのように完了ベースではなく、依然として通知ベースであるということです。
- Boost ASIO :: Linux で epoll を使用するため、proactor デザイン パターンを達成するためにユーザー コードから完全に抽象化されたスレッドを生成するため、真の非同期パターンではありません。
- libevent :: ASIO の方が好きなのですが、それを選ぶ理由はありますか?
ここに質問があります:)
- epoll を使用して高速でスケーラブルなネットワーク サーバーを作成するための最適な設計パターンは何でしょうか (もちろん、ここではスレッドを使用する必要があります :( )
- 「ノンブロッキングモードではソケットのみを開くことができる」とどこかで読んだことがあります。したがって、epoll はソケットのみをサポートするため、ディスク I/O には使用できません。上記の説明はどの程度正しいのでしょうか? また、 epoll を使用してディスク I/O で非同期プログラミングを実行できないのはなぜですか?
- Boost ASIO は、epoll 呼び出しの周りに 1 つの大きなロックを使用します。その意味と、asio自体を使用してそれを克服する方法を実際には理解していませんでした。同様の質問
- ディスク ファイルで動作するように ASIO パターンを変更するにはどうすればよいですか? おすすめのデザインパターンはありますか?
誰かが素晴らしい説明ですべての質問に答えることができることを願っています. epoll および AIO 設計パターンの実装の詳細が説明されているソースへのリンクも歓迎します。
multithreading - スレッドを作成せずに AIO を実行できますか?
読み取り操作が完了したときに aio がプログラムに通知するようにしたいと思います。このページによると、そのような通知は、カーネルから送信されたシグナル、またはユーザー関数を実行するスレッドの開始によって受信できます。の正しい値を設定することで、どちらの動作も選択できますsigev_notify
。
試してみると、シグナルで通知を受け取るように設定しても、別のスレッドが作成されていることがすぐにわかりました。
ドキュメントには、次のようにも記載されています。これらの関数の実装は、カーネルのサポート (利用可能な場合) を使用するか、ユーザーレベルのスレッドに基づく実装を使用して行うことができます。スレッドをまったく使用したくないのですが、これは可能ですか?
カーネルをチェックしたところ、問題ないようです。
(もちろん、メインスレッドは別として)(ユーザーランド)スレッドなしでaioを実行することは可能ですか?
編集:私はそれをより深く掘り下げました。librt は aio 関数のコレクションを提供しているようです: glibc のソースを調べると、怪しいものが露出しました: 内部 /rt/aio_read.c は関数スタブです:
サブディレクトリ sysdeps/pthread で最初の関連する実装を見つけました__aio_enqueue_request(..., LIO_READ)
。これは を直接呼び出し、次に pthread を作成しました。しかし、なぜその場合にスタックが発生するのか疑問に思っていたので、おそらくスタブは Linux カーネル自体によって実装される可能性があり、その pthread 実装はある種のフォールバック コードになるのではないかと考えました。
/usr/src/linux ディレクトリをgrep するとaio_read
、多くの結果が得られます。これについては、現在理解しようとしています。
c++ - 非同期 I/O Linux
非同期 I/O 処理が必要
Linux で aio* 呼び出しによる非同期 I/O の使用を計画する
状況:
AF_INET および SOCK_STREAM フラグ (TCP) を使用してソケットを開きました 送信バッファーの最高水準点を制限しています そのソケットに非同期で書き込み、送信バッファーがオーバーフローしたときにソケットを切断したい
だから、私は質問があります:
TCP ソケットで aio_write の非同期呼び出しを行ったとき、I/O 完了が到着するのはいつですか?ソケット バッファーに書き出されたバッファーまたは配信が確認されるのはいつですか? どうすればこの動作を管理できますか?
lio_listio テクニックでこれを処理する最善の方法
よろしく、 アンドリュー
linux - libaioコールバックでのコンテキストデータの適切な処理?
私はカーネルレベルの非同期I/O(つまりlibaio.h
)を使用しています。struct iocb
usingを送信する前に、関数ポインタをに固定するio_submit
を使用してコールバックを設定しました。最後に、を使用して完了したイベントを取得し、各コールバックを実行します。io_set_callback
iocb->data
io_getevents
コールバック内でいくつかのコンテキスト情報(送信タイムスタンプなど)を使用できるようにしたいと思います。これを行うことを考えることができる唯一の方法は、を使用し続けることですio_getevents
がiocb->data
、コンテキストとコールバックを持つ構造体を指します。
このようなことをするための他の方法はありますか、そしてiocb->data
使用するときに手つかずであることが保証されていio_getevents
ますか?私の理解では、関数を指していないlibaio
場合に問題となるコールバックを自動的に実行する別の方法があります。iocb->data
ここでの説明があればいいのですが。のドキュメントはlibaio
本当に不足しているようです。
linux - 「lio_listio」への未定義の参照 [posix 非同期 I/O]
プログラムで POSIX API 'lio_listio' を使用して、1 つのカーネル コンテキスト スイッチのオーバーヘッドで複数の非同期 I/O システム コールを発行しようとしています。
ライブラリ aio.h をインクルードし、コードを -laio フラグでコンパイルしました。また、libaio_devel パッケージがインストールされています。
それでも、プログラムをコンパイルすると、次のコンパイル エラーが発生します。
/home/me/bon/bon.cpp:2509: `lio_listio' への未定義の参照
誰かが私が欠けているものを提案してもらえますか.