【问题标题】:How to minimize CPU consumption with a fixed thread loop period如何使用固定的线程循环周期最小化 CPU 消耗
【发布时间】: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。

标签: c++ c pthreads


【解决方案1】:

使用这种结构将导致每秒大约 67 次任务切换,并且很可能切换到不同的进程,这意味着包括页表在内的完整上下文切换。自从我研究 ARM 中涉及的内容以来已经有一段时间了,但我确信这不是“轻量级”操作。如果我们倒数,其中 1.75% 是每个任务切换大约 210k 个时钟周期。这似乎很多。但我不确定清理 TLB、缓存等涉及多少工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-06
    • 2012-07-20
    • 2012-11-11
    • 2012-09-25
    • 2021-04-14
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    相关资源
    最近更新 更多