3

私は小さなc++フレームワークに取り組んでおり、非同期の読み取りと書き込みもサポートするファイルクラスを持っています。私が見つけたいくつかのワーカースレッド内で同期ファイルI/Oを使用する以外の唯一の解決策は、aioです。とにかく、私はどこかを見回して読んでいました。Linuxでは、aioはカーネルではなく、ユーザースレッドで実装されています。OSXについても同じですか?もう1つの懸念は、コールバックのaioの機能です。これは、特定のスレッドまたはスレッドプールを割り当てて処理することができないため、コールバックごとに追加のスレッドを生成する必要があります(シグナルは私にとってオプションではありません)。だからここにそれから生じる質問があります:

  • aioはosxのカーネルに実装されているので、私自身のスレッド化された実装よりも優れている可能性がありますか?

  • コールバックシステム(コールバックごとにスレッドを生成する)は、実際にはボトルネックになる可能性がありますか?

  • aioをosxで使用する価値がない場合、unixで他の選択肢はありますか?ココアで?カーボンで?

  • または、自分のスレッドプールで非同期i / oをエミュレートする必要がありますか?

このテーマについてのあなたの経験は何ですか?

4

2 に答える 2

5

ここで、AIOがOSXにどのように実装されているかを正確に確認できます

実装では、カーネルスレッドを使用します。これは、各スレッドがポップし、各リクエストの優先度に基づいて優先度キューでブロック方式で実行されるジョブの1つのキューです(少なくとも一見すると、このように見えます)。

スレッドの数とキューのサイズは、で構成できますsysctl。これらのオプションとデフォルト値を確認するには、次を実行しますsysctl -a | grep aio

kern.aiomax = 90
kern.aioprocmax = 16
kern.aiothreads = 4

私の経験では、AIOを使用する意味があるためには、これらの制限をはるかに高くする必要があります。

スレッドでのコールバックに関しては、MacOSXがそれをサポートしているとは思いません。シグナルを介した完了通知のみを行います(ソースを参照)。

あなたはおそらくあなた自身のスレッドプールで同じくらい良い仕事をすることができます。現在のダーウィンの実装よりも優れた方法の1つは、読み取りジョブをディスク上の物理的な場所で並べ替えることです(fcntlおよびを参照F_LOG2PHYS)。これにより、優位に立つこともできます。

于 2011-05-12T04:58:06.470 に答える
0

@Moka:Linuxの実装が間違っていると言って申し訳ありませんが、カーネル2.6の時点で、libaio(libaio.h)に含まれるAIOのカーネル実装があります。

カーネルスレッドを使用せず、代わりにユーザースレッドを使用する実装はPOSIX.1 AIOであり、すべてのUNIXベースのOSがカーネルレベルで完了イベントをサポートしているわけではないため、移植性を高めるためにそのようにしています。

于 2013-06-24T21:27:29.757 に答える