2012-01-04 8 views
5

私が選択して、マルチスレッドプログラミングが低いたとえばこのIBM developerworks article on high perfomance IOため、IOモデルを実行していたことを読んだことがあります。なぜAIOはマルチスレッド入出力の選択処理より優れていますか?

同期/非同期の仕組みがわかりません:ブロック/非ブロックがパフォーマンスを向上させています。ここでAIOが最適な理由は何ですか?それは仕事をしてから、他のスレッドを保持しますので、それが必要以上に長くをブロックする単一スレッドの悪いスレッド環境で

+2

私は質問を明確にします。リンクは、様々なI/Oモデルの比較が含まれており、 'AIO'は特に==ビジーウェイトを含む提供されている例の一部'(aio_error(&my_aiocb)しばらく与え、私はあまりにも疑わしい見つけるSELECT'、 'よりも優れていると言いますEINPROGRESS); '。 – avakar

+0

@avakar:ここで*パフォーマンス*は実行時間/応答性に関連していると言いますか? –

+0

@MatthieuM。はい、それは私がそれを理解した方法です。 – avakar

答えて

4

非同期および/または非ブロッキングでは、システム内の個々のIO操作に本質的なスピードブーストを提供しません。ディスクから何ミリ秒かかるかを判断するには、数ミリ秒かかることになります。

これらのアプローチの利点は、IO操作をメインの実行スレッドとは別にできるようにすることで、マルチスレッド環境(またはIOの遅延にもかかわらず操作を継続できる環境)にも当てはまります。このことから認識されるパフォーマンスの向上は、単にIOが戻るかブロック解除されるのを待つために使用されるリソースの数が減少したためです。

threadでは非同期と非ブロックの比較が可能です。

+1

2つ以上の '実行の主なスレッド'があります(IOCPを参照)。さらに多くの作業がカーネルにプッシュされるため、AIOも勝ちます。そのため、リングサイクルや回避可能なコピーが減ります。 –

0

。この非同期ノンブロッキングIOを防止するために使用されます。これの共通ライブラリはBoost.Asioです。

+1

シングルスレッドが無期限に "読み取り"または "recv"をブロックすると、他のスレッドがCPUを計算するのではないのですか?私は –

+1

はなぜ他のスレッドを拘束一つのスレッドをブロックします。..ブロッキングがこのスレッドにカーネルからの信号のいくつかの並べ替えによって除去されない限りまでスレッドがCPUを放棄しなければならない(印象ではまだだ)と思いましたか?ミューテックスなどを保持することはできません。、あるいはそうした場合、AIOで同じコードを書くことはできません。 – Rup

0

これを考慮すると、ユーザーがテキストを入力するのを待つ必要がある時点に達すると、2つの選択肢があります。実行するまで待ってから、CPUが何もしない、または現在のプログラムをブロックして使用できますCPUは他の有用な計算を行う。ユーザーが入力した後、プログラムのブロックを解除して続行できます。これにより、パフォーマンスを向上させることができます。

+0

"あなたは2つの選択肢があります:彼がするまで待って、CPUは何もしません。" ..それは他のスレッドが暗黙のうちに呼び出されるのではないですか? –

+0

@AnerudhanGopal、まあまあまあまあではない、他のスレッドもチャンスを得るだろうが、IOスレッドはチャンスを得るたびにブロックされないので、ユーザーが何かを入力するまでCPUを無駄にするだろう。 – atoMerz

1

単一のIOが完了するのを待っている間にプロセス全体をブロックすることは、プロセスが実行できる他のものがある場合には効率的ではありません( )。 AIOは、システムがそれのためにIOをやっ いる間に他の事をするプロセスを可能にする 一つの手段です。マルチスレッド化は別のものです。 の複数のスレッドを使用するかAIOを使用するかの違いは、主に設計の1つです。 一般的なサーバでは、例えば、それは、複数のスレッドを使用する方がはるかに簡単だ と性能に大きな違いがあってはなりません。他の アプリケーションでは、AIOがよりシンプルになり、パフォーマンスが向上する可能性があります。それは考慮する別のツールである ですが、どこにも適用されません。

関連する問題