【发布时间】:2013-05-14 07:47:28
【问题描述】:
我使用 pthread lib 2.8,操作系统内核是 arm 上的 Linux 2.6.37。在我的程序中,线程 A 使用 pthread 接口将调度优先级设置为sched_get_priority_min(policy) 和sched_get_priority_max(policy) 之间的中间点。
在线程函数循环中:
{
//do my work
pthread_cond_timedwait(..., ... , 15 ms)
}
我发现这个线程消耗了大约 3% 的 CPU。如果我将超时更改为 30 毫秒,它会减少到 1.3%。但是,我不能增加超时。有没有办法在不减少超时的情况下减少 CPU 消耗?看来成本是由于线程切换造成的。
【问题讨论】:
-
“做我的工作”实际上涉及什么?或者,换一种说法,为什么你认为“线程切换的成本”是主要组成部分。你在哪个处理器上运行这个?我使用与您的代码类似的东西做了一个实验,结果 CPU 使用率为 0.0%。
-
我用的是ARM cortex risc ARMv7 @800Mhz。我取消所有工作做测试:等待15ms 0.88%~1.75%;等待 30 毫秒 0%。该程序是-o0级别的调试版@Mats Petersson
-
@MatsPetersson 现在我的线程循环只是:pthread_cond_timedwait(time)
-
好的,这比我的 AMD 四核处理器慢一点,这可以解释为什么它会占用这么多时间。我不确定你能做些什么。毕竟,您每 15 毫秒醒来一次(因此每秒 60 次),这将花费一些时间,并且操作系统会在此期间安排其他事情(即使它只是“空闲”线程)。跨度>
-
@MatsPetersson 谢谢你。我会阅读有关多线程和 Posix 线程的书,然后尝试了解 COST。