2012-04-14 81 views
1

當我編寫一個運行10分鐘的簡單應用程序時,它啓動10個線程一次(pthreads),每個在循環中休眠1 ms(不做其他任何事情) 。 44%(top報道)。它是一個450 MHz的ARM9 CPU,使用Linux 2.6.37作爲操作系統。沒有其他程序在運行,它嘗試了不同的內核配置(動態蜱,軟/硬中斷,高分辨率定時器,...,...),不同的優先級(高達99),但數字保持不變一樣。 /usr/bin/time -v顯示約。 5'200'000自願上下文切換和ca.內核空間花費了3分鐘。在每個線程的睡眠。 5毫秒,CPU利用率下降到約。 9%,這仍然是國際海事組織瘋狂(40'500'000週期,以安全的一些寄存器)。 clock_nanosleep用於睡眠(CLOCK_REALTIME/CLOCK_MONOTONIC沒有改變任何東西)。在ARM9上的Linux上的線程性能降低

我知道完整的上下文切換在ARM9上是昂貴的,因爲緩存必須被清除。但一個簡單的線程切換或切換到操作系統應該不是那麼昂貴的恕我直言(地址空間保持不變,不需要緩存/ TLB刷新)。這是常見的還是應該嘗試找到內核的瓶頸?

+0

你用什麼原始的'睡眠'? (我不知道你的問題,但似乎可能是有趣的。) – Mat 2012-04-14 09:30:19

+0

@Mat忘記補充說,改變它 – azraiyl 2012-04-14 09:32:07

回答

1

您正在忙着醒來,並以100uS的間隔回到睡眠狀態 - 10個線程,1ms,平均爲100uS。並且請記住,每100uS間隔有兩個上下文切換,因此您每隔50uS平均有一次上下文切換,或每秒20,000次。

也許這就是你要找的答案?

+0

在1毫秒的時間範圍內10個線程應該運行,因此需要10個上下文切換。正如我所描述的'/ usr/bin/time'顯示了我期望的許多上下文切換。 100 us是45000個週期。 44%是ca. 20'000個週期(如果您採取9%和5毫秒的結果幾乎相同)。保存/恢復寄存器爲20'000個週期,並選擇另一個線程。我認爲我在這裏錯過了一些東西。 – azraiyl 2012-04-15 17:12:43

+0

首先,調度一個線程需要兩個上下文切換。第一種是當線程1停止並且O/S獲得控制時。第二個是線程2被調度的時候。上下文切換對處理器來說並不「友好」,並導致處理器,其管線,緩存控制器等的大量中斷。 – 2012-04-30 07:05:36