把线程睡得太高的开销?

时间:2015-02-05 15:16:13

标签: linux multithreading kernel sleep overhead

我正在使用AM3505处理器(ARM Cortex-A8单核)上的嵌入式Linux系统。我试图弄清楚为什么上下文切换使用的cpu时间比我预期的要多。

虽然lmbench的lat_ctx基准测试告诉我,上下文切换应该需要大约40到50秒,根据htop,这个循环给我大约4.3%的CPU使用率。

int main(int argc, char** argv)
{
    while(1) {
      usleep(2500);
      printf("tick\n");
    }
    return 0;
}

这将导致每个'tick'产生107.5个使用时间。

使用strace对进程进行概要分析可以得到大约8%的cpu使用率和:

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 93.45    0.292904          29     10038           nanosleep
  6.55    0.020528           2     10039           write
------ ----------- ----------- --------- --------- ----------------
100.00    0.313432                 20077           total

Linux内核配置为具有高分辨率计时器支持的完全可预留实时。这会对测量产生任何影响吗? htop中显示的cpu用法是不正确的吗?

1 个答案:

答案 0 :(得分:0)

每个tick有两个上下文切换,一个是从执行进程到等待定时器,另一个是等待定时器再次运行进程。因此,每个周期107.5us与上下文切换完全一致,大约需要40-50us,因为每个周期包括两个上下文切换和一些输出。