当我编写一个简单的应用程序,运行10分钟时,它会启动10个线程一次(pthreads),每个线程在一个循环中休眠1毫秒(没有做任何其他事情),CPU使用ca. 44%(top
报告)。它是一个450 MHz的ARM9 CPU,Linux 2.6.37用作操作系统。没有其他程序在运行,它尝试了不同的内核配置(动态刻度,软/硬IRQ,高分辨率计时器,......,......,),不同的优先级(最多99)但数字保持不变相同。 /usr/bin/time -v
显示大约5'200'000自愿上下文切换和ca.内核空间花了3分钟。睡在每个线程中为ca. 5毫秒,CPU利用率下降到大约9%,这是IMO仍然疯狂(安全一些寄存器40'500'000周期)。 clock_nanosleep用于休眠(CLOCK_REALTIME / CLOCK_MONOTONIC没有改变任何东西)。
我知道ARM9上的完整上下文切换很昂贵,因为必须清除缓存。但是一个简单的线程切换,或切换到操作系统不应该是那么昂贵的IMHO(地址空间保持不变,不需要缓存/ TLB刷新)。这是常见的还是我应该尝试在内核中找到瓶颈?
答案 0 :(得分:1)
你正忙着醒来,以100uS的间隔重新入睡 - 10个线程,1毫秒,平均为100uS。请记住,每个100uS间隔都有两个上下文切换,因此平均每50uS或每秒20,000次进行一次上下文切换。
也许这就是你要找的答案?