問題タブ [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 - Linuxでのバッファリングされた非同期ファイルI/O
Linuxで非同期ファイルI/Oを実行するための最も効率的な方法を探しています。
POSIX glibc実装は、ユーザーランドのスレッドを使用します。
ネイティブのaioカーネルAPIはバッファリングされていない操作でのみ機能し、バッファリングされた操作のサポートを追加するカーネルのパッチが存在しますが、それらは3年以上前のものであり、メインラインに統合することを誰も気にしないようです。
非同期I/Oを可能にする他のアイデア、概念、パッチをたくさん見つけましたが、それらのほとんどは3年以上前の記事にあります。今日のカーネルで実際に利用できるのは何ですか?サーブレット、呼び出し、カーネルスレッドを含むものなど、今は覚えていないことについても読んだことがあります。
今日のカーネルでバッファリングされた非同期ファイルの入出力を行う最も効率的な方法は何ですか?
java - クライアントへの大きなバイト配列転送
私の状況を紹介させてください。
サーバー上のファイルに保存されているバイト単位のデータがたくさんあります。JDK7 で導入される AIO を使用して、このファイルを読み書きしています。したがって、読み取りおよび書き込み操作に ByteBuffer(s) を使用しています。
問題は、AsynchronousFileChannel で読み取りを実行したら、読み取り操作で使用された ByteByffer の内容をクライアントに転送したいということです。したがって、実際にバイトを送信したいと思います。
ここからどうするのが最善の方法でしょう。再利用するプールがあるため、ByteBuffer を送信したくありません。したがって、これはオプションではありません。いくつかの読み取りを組み合わせて、一度に組み合わせた複数の ByteBuffer(s) のコンテンツを送信することもできるようにしたいと考えています。
さて、何を送ろう。ただのバイト[]配列?それともストリームが必要ですか?ここでのパフォーマンスに関する最善の解決策は何ですか。
通信には RMI を使用しています。
事前にサンクス。
linux - イベント駆動型と非同期の違いは何ですか?epollとAIOの間?
イベント駆動型と非同期は、多くの場合、同義語として使用されます。2つの間に違いはありますか?
epoll
また、との違いは何aio
ですか?それらはどのように組み合わされますか?
最後に、LinuxのAIOがひどく壊れていることを何度も読みました。それはどのくらい正確に壊れていますか?
ありがとう。
macos - aio on osx:カーネルに実装されていますか、それともユーザースレッドで実装されていますか?別のオプション?
私は小さなc++フレームワークに取り組んでおり、非同期の読み取りと書き込みもサポートするファイルクラスを持っています。私が見つけたいくつかのワーカースレッド内で同期ファイルI/Oを使用する以外の唯一の解決策は、aioです。とにかく、私はどこかを見回して読んでいました。Linuxでは、aioはカーネルではなく、ユーザースレッドで実装されています。OSXについても同じですか?もう1つの懸念は、コールバックのaioの機能です。これは、特定のスレッドまたはスレッドプールを割り当てて処理することができないため、コールバックごとに追加のスレッドを生成する必要があります(シグナルは私にとってオプションではありません)。だからここにそれから生じる質問があります:
aioはosxのカーネルに実装されているので、私自身のスレッド化された実装よりも優れている可能性がありますか?
コールバックシステム(コールバックごとにスレッドを生成する)は、実際にはボトルネックになる可能性がありますか?
aioをosxで使用する価値がない場合、unixで他の選択肢はありますか?ココアで?カーボンで?
または、自分のスレッドプールで非同期i / oをエミュレートする必要がありますか?
このテーマについてのあなたの経験は何ですか?
linux - プロアクティブなWebサーバーで接続を受け入れる従来の方法(非同期IOを使用)
私は現在、Linux上のaioを調べて、Webサーバーの実装に使用しています。私がすでに発見したように、aioの使用法を詳細にカバーするリソースはそれほど多くありません。
問題は、aioを使用するシングルスレッドアプリケーションでクライアント接続を受け入れる従来の方法は何ですか?(可能な限り最小限のブロッキングで)
理想的には、接続が確立され、ハンドラー内でaio_readが一度に呼び出されるという通知(私の場合はコールバック関数呼び出し)を送信するaio_accept操作を確認できます。しかし、そのような呼び出しはありません:(
ありがとう!
c - aio_write が終了したかどうかを確認する
特定のファイルへの AIO 書き込みがないかどうかを確認する方法はありますか? Unix コースでプロジェクトを作成しています。これは、コンテキスト フリー (UDP ベース) のチェス サーバーであり、すべてのデータをファイルに保存する必要があります。アプリケーションはシングル プロセスおよびシングル スレッドになります (AIO 関数を想定)。私の問題は次のとおりです。
1) プレイヤー 1 がファイルへの aio_write 操作をトリガーするデータを送信し、プロセスが進行します
2) プレイヤー 2 がそのファイルから読み取る必要がある現在のボードの状態を要求しますが、前の aio_write がまだ終了していない場合、このファイルは最終的なものではないため、まだ読み込まれていませんが、aio_write が終了するのを待ちます。
問題は、コンテキストフリーであるため、aio_write 呼び出しからの aiocb 構造がないことです。
また、特定のファイルが現在書き込み中の場合にのみ、気にする必要のない他のゲーム (異なるファイルを使用する) からの aio_writes がある可能性もあります。
c - 1 つの nginx ワーカー プロセスは、2 つのリクエストを同時に処理しますか、それとも 1 つずつ処理しますか?
フィルタ チェーンの非常に優れた点は、各フィルタが前のフィルタの終了を待たないことです。Unix パイプラインのように、前のフィルターの出力を生成時に処理できます。(ここから)
上記は、各フィルターの最後にあるそのようなコードについて話していると思います。
つまり、nginx はフィルターを 1 つずつチェーンします。ただし、各フィルターの最後にあるため、現在のフィルターが完了するまで待機する必要があります。nginx がどうやってeach filter doesn't wait for the previous filter to finish
.
したがって、上記はnginxフィルターの同時実行性についてであり、次はnginxリクエスト処理の同時実行性についてです:
私たちが知っているように、nginxはepoll
リクエストを処理するために使用します:
上記のようなコードでは、nginx が 2 つのリクエストを同時に処理できるとは思えません。1 つずつしか処理できません (それぞれhandler
が十分な速さでジョブを終了するため、次のリクエストはすぐに処理されます)。
または、私が見逃している落とし穴はありますか?
c - C-aio_read()とaio_write()の両方を使用する方法
読み取りと書き込みの両方が必要なゲームサーバーを実装します。したがって、着信接続を受け入れ、aio_read()を使用して読み取りを開始しますが、何かを送信する必要がある場合は、aio_cancel()を使用して読み取りを停止してから、aio_write()を使用します。writeのコールバック内で、読み取りを再開します。だから、私はいつも読んでいますが、何かを送る必要があるときは、読書を一時停止します。
これは約20%の時間機能します。それ以外の場合、aio_cancel()の呼び出しは「操作が進行中です」で失敗し、キャンセルできません(永続的なwhileサイクル内であっても)。したがって、追加した書き込み操作は発生しません。
これらの関数をうまく使う方法は?私は何を逃しましたか?
編集:Linux2.6.35で使用されます。Ubuntu10-32ビット。
コード例:
c - Linux カーネルの aio 機能
カーネルの非同期 io 関数 (posix aio ではない) をテストしており、それがどのように機能するかを理解しようとしています。以下のコードは、O_DIRECT を使用して開いたファイルに配列を繰り返し書き込むだけの完全なプログラムです。コールバック関数で「write Missed bytes expect 1024 got 0」というエラーが発生します (work_done() の fprintf ステートメントを参照)。
カーネル aio に慣れていない方のために説明すると、以下のコードは次のことを行います。
- いくつかの構造体を初期化する
- aioの準備(io_prep_pwrite)
- io リクエストの送信 (io_submit)
- イベント完了の確認 (io_getevents)
- コールバック関数を呼び出して、すべてがうまくいったかどうかを確認します。
手順 5 でエラーが発生します。O_DIRECT を使用してファイルを開かない場合、問題なく動作しますが、非同期書き込みの目的を達成できません。誰かが私が間違っていることを教えてもらえますか? これはカーネル aio の正しい使用法ですか? たとえば、コールバックの使用法は正しいですか? O_DIRECT の使用に制限はありますか?
「gcc -Wall test.c -laio」を使用してコンパイルします
前もって感謝します。
c++ - Linux での AIO サポート
最新の Linux カーネルでの aio のカーネル サポートの状態に関する最新情報を入手できる場所を知っている人はいますか? Google 検索では、どうしようもなく古い Web ページが表示されます。
編集:
より具体的には、パイプやソケットなど、ファイルに関連しない記述子に興味があります。Web 上の情報では、サポートがないことが示されていますが、これはまだ当てはまりますか?
Edit2:私が探しているのは、Windows OVERLAPPED IO に似たものです