aio on osx:カーネルに実装されていますか、それともユーザースレッドで実装されていますか?その他のオプション?
-
29-10-2019 - |
質問
小さなc ++フレームワークに取り組んでおり、非同期の読み取りと書き込みもサポートするファイルクラスがあります。私が見つけたいくつかのワーカースレッド内で同期ファイルI / Oを使用する以外の唯一の解決策は、aioです。とにかく私はどこかを見回して読んでいました。Linuxでは、aioはカーネルに実装されておらず、ユーザースレッドで実装されています。 OSXについても同じですか?もう1つの懸念は、コールバックのaioの機能です。これは、特定のスレッドまたはスレッドプールを割り当てて処理することができないため、コールバックごとに追加のスレッドを生成する必要があります(シグナルは私にとってオプションではありません)。それで、これから生じる質問があります:
-
aioはosxのカーネルに実装されているので、私自身のスレッド実装よりも優れている可能性がありますか?
-
コールバックシステム(コールバックごとにスレッドを生成する)が実際のボトルネックになる可能性はありますか?
-
aioをosxで使用する価値がない場合、unixで他の選択肢はありますか?ココアで?カーボンで?
-
または、独自のスレッドプールを使用して非同期I / Oをエミュレートする必要がありますか?
このテーマについてのあなたの経験は何ですか?
解決
AIOがOSXにどのように実装されているかを正確に確認できます
実装では、カーネルスレッドを使用します。これは、各スレッドがポップし、各リクエストの優先度に基づいて優先度キューでブロック方式で実行されるジョブの1つのキューです(少なくとも一見したところ、そのように見えます)。
sysctl
を使用して、スレッドの数とキューのサイズを構成できます。これらのオプションとデフォルト値を確認するには、sysctl -a | grep aio
を実行してください
ジェネラコディセタグプレ
私の経験では、AIOを使用する意味があるためには、これらの制限をはるかに高くする必要があります。
スレッドでのコールバックに関しては、Mac OSXがそれをサポートしているとは思いません。シグナルを介した完了通知のみを行います(ソースを参照)。
おそらく、自分のスレッドプールで同じくらい良い仕事をすることができます。現在のダーウィンの実装よりも優れた方法の1つは、読み取りジョブをディスク上の物理的な場所で並べ替えることです(fcntl
およびF_LOG2PHYS
を参照)。これにより、優位に立つこともできます。
他のヒント
@Moka :Linuxの実装が間違っていると言って申し訳ありませんが、カーネル2.6の時点で、libaio(libaio.h)に含まれるAIOのカーネル実装があります>
カーネルスレッドを使用せず、代わりにユーザースレッドを使用する実装はPOSIX.1 AIOであり、すべてのUNIXベースのOSがカーネルレベルで完了イベントをサポートしているわけではないため、移植性を高めるためにそのようにしています。