2012-04-14 2 views
1

単純なアプリケーションを作成して10分間実行すると、10スレッドを1回(pthreads)起動し、ループ中に1msの間スリープします。 。 44%(topはそれを報告している)。 450 MHzのARM9 CPU、Linux 2.6.37がOSとして使用されています。実行中の他のプログラムはありません。異なるカーネル設定(Dynamic Ticks、Soft/Hard IRQ、High Resolution Timer、...、...)、異なる優先順位(最大99)を試しましたが、同じ。 /usr/bin/time -vはca.任意のコンテクストスイッチとca. 3分はカーネル空間で費やされます。 caのための各スレッドのSleepin 5ミリ秒、CPU使用率はca.に低下します。 IMOはまだ狂っている9%(40'500'000サイクルが安全ないくつかのレジスタに)。 clock_nanosleepはスリープに使用されました(CLOCK_REALTIME/CLOCK_MONOTONICは何も変更しませんでした)。Linux上でのARM9でのスレッディング速度の遅さ

キャッシュをクリアする必要があるため、ARM9では完全なコンテキストスイッチが高価であることに気付いています。しかし、簡単なスレッドスイッチやOSへの切り替えは、高価なIMHO(アドレス空間は同じで、キャッシュ/ TLBフラッシングは不要)であってはいけません。これはよくあることですか、カーネルのボトルネックを見つけようとするべきですか?

+0

「スリープ」にはどのプリミティブを使用していますか? (私はあなたの質問については考えていませんが、多分興味のあるようです) – Mat

+0

@Matはそれを忘れた、変更しました – azraiyl

答えて

1

あなたは忙しく目を覚まし、100uSの間隔で眠りに戻っています - 10スレッド、1ms、それは平均100μSです。 100uSの間隔ごとに2つのコンテキストスイッチがあるので、平均で50uSごとに、または毎秒20,000回、コンテキストスイッチがあります。

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

+0

1ミリ秒以内に10スレッドが実行されるはずです。私が '/ usr/bin/time'に述べたように私が期待するいくつかのコンテキストスイッチが表示されています。 100 usは45000サイクルです。 44%はca. 20,000サイクル(9%と5ミリ秒を取ると結果はほぼ同じです)。レジスタをセーブ/リストアするために20,000サイクル、別のスレッドを選択します。私はここに欠けているものがあると思う。 – azraiyl

+0

まず、スレッドをスケジュールするには2つのコンテキストスイッチが必要です。第1は、スレッド1が停止し、O/Sが制御を獲得するときである。 2番目はスレッド2がディスパッチされるときです。コンテキストスイッチは、プロセッサにとって「フレンドリ」ではなく、プロセッサ、そのパイプライン、キャッシュコントローラなどに大規模な混乱をもたらす。 –

関連する問題