1

10分間実行する単純なアプリケーションを作成すると、10個のスレッドが1回(pthread)開始され、それぞれがループ内で1ミリ秒スリープします(他に何もしません)。44%(topそれを報告します)。これは450MHzのARM9CPUであり、OSとしてLinux2.6.37が使用されています。他に実行中のプログラムはありません。さまざまなカーネル構成(動的ティック、ソフト/ハードIRQ、高解像度タイマー、...、...、...)、さまざまな優先度(最大99)を試しましたが、数値は変わりません。同じ。/usr/bin/time -v約を示しています。5'200'000の自発的なコンテキストスイッチと約 カーネル空間で3分が費やされます。約のための各スレッドのSleepin。5ミリ秒で、CPU使用率は約5ミリ秒に低下します。9%はまだIMOが狂っています(一部のレジスタを安全にするために40'500'000サイクル)。clock_nanosleepはスリープに使用されました(CLOCK_REALTIME / CLOCK_MONOTONICは何も変更しませんでした)。

キャッシュをクリアする必要があるため、ARM9ではフルコンテキストスイッチにコストがかかることを認識しています。ただし、単純なスレッド切り替え、またはOSへの切り替えは、それほど高価なIMHOであってはなりません(アドレス空間は同じままで、キャッシュ/ TLBフラッシュは必要ありません)。これは一般的ですか、それともカーネルのボトルネックを見つけようとする必要がありますか?

4

1 に答える 1

1

あなたは忙しく目を覚まし、100uS間隔でスリープ状態に戻ります-10スレッド、1ms、平均で100uSです。また、これらの100uS間隔ごとに2つのコンテキストスイッチがあるため、平均して50uSごと、つまり1秒間に20,000回コンテキストスイッチがあることに注意してください。

おそらくそれがあなたが探している答えですか?

于 2012-04-15T01:54:27.383 に答える