【问题标题】:Linux/C: Check if context switch has occurred from inside threadLinux/C:检查是否从线程内部发生了上下文切换
【发布时间】:2016-10-14 03:27:56
【问题描述】:

在 Linux/GNU/C 环境中,是否可以看到正在运行的线程是否已进入睡眠状态。例如说你有一个类似的功能

void foo() {
  startClock();
  bar();   
  endClock();
}

但您只关心代码本身的运行时间。 IE。您不关心与运行期间被挂起的线程相关的任何时间。理想情况下,您可以利用一些系统调用或库,例如 countThreadSwitches(),这样:

void foo() {
  int lastCount = countThreadSwitches();
  startClock();
  bar();
  endClock();
  if (countThreadSwitches() != lastCount)
    discardClock();

}

能够判断线程是否已在两个语句之间切换,将允许我们仅测量不受上下文切换影响的运行。

那么,有没有类似假设的 countThreadSwitches() 调用?或者这些信息对线程本身是不透明的?

【问题讨论】:

  • 可以通过运行foo 10000 次来推断信息,并保留所用时间的直方图。假设foo 相当短(小于 10 毫秒),大部分时间将分组在时间尺度的低端,即实际运行时间。
  • 如果您正在调用clock() 系统函数,那么您已经获得了只考虑线程实际运行时间的时钟值。 (即时钟()返回的值仅在您的线程实际运行时增加)
  • @JeremyFriesner clock 不返回处理时间。在一个进程中有多个线程,我不认为clock 会给你线程时间
  • @Jeremy 使用 CLOCK_THREAD_CPUTIME_ID 不是一个坏建议。不幸的是,开销比 CLOCK_REALTIME 差了大约 6 倍。
  • @user3386109 这是个好主意。不幸的是,假设有问题的代码有一个很长的右尾,这是特别有趣的。可以可靠地确定中位数,但如果我们想要可靠地估计第 99.9 个百分位数。

标签: c linux multithreading pthreads


【解决方案1】:

在 Linux 上,您可以读取和解析来自 /proc/self/statusnonvoluntary_ctxt_switches: 行(最好只在之前和之后执行一个 4096 字节的 read(),然后再解析它们)。

【讨论】:

  • 这很聪明,关于懒惰解析的好处。谢谢
【解决方案2】:

在 linux 中,int getrusage(int who, struct rusage *usage); 可用于填充包含 timeval ru_utime(使用的用户 CPU 时间)和 timeval ru_stime(使用的系统 CPU 时间)的结构,用于线程或进程。

这些值以及系统时钟将让您知道您的进程/线程实际运行的 CPU 时间与未花费多少时间运行您的进程/线程的比较。

例如像(ru_time + ru_stime) / (clock_endtime - clock_startstart) * 100 这样的东西会给你CPU使用率作为开始和结束之间时间的百分比。

在某些情况下,还有一些关于上下文切换次数的统计信息,但这些信息不是很有用。

【讨论】:

  • 很好的建议,非常接近我正在寻找的东西。谢谢
猜你喜欢
  • 2016-12-26
  • 2015-09-29
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 2012-09-19
相关资源
最近更新 更多