C++ 多任务和测量时间差

C++ 多任务和测量时间差,c++,c,multitasking,C++,C,Multitasking,我知道抢占式多任务操作系统可以在任何“代码位置”中断进程 给定以下代码: int main() { while( true ) { doSthImportant(); // needs to be executed at least each 20 msec // start of critical section int start_usec = getTime_usec(); doSthElse(); int timeDiff_usec = get

我知道抢占式多任务操作系统可以在任何“代码位置”中断进程

给定以下代码:

int main() {
  while( true ) {
    doSthImportant(); // needs to be executed at least each 20 msec
    // start of critical section
    int start_usec = getTime_usec();
    doSthElse();
    int timeDiff_usec = getTime_usec() - start_usec;
    // end of critical section
    evalUsedTime( timeDiff_usec );
    sleep_msec( 10 );
  }
}
我希望这段代码通常能为timeDiff\u usec生成正确的结果,特别是在dothelse()getTime\u usec()不占用太多时间的情况下,它们很少被操作系统调度程序中断

但该计划会不时在“关键部分”的某个地方被打断。上下文开关将执行它应该执行的操作,在这种情况下,程序仍将为timeDiff\u usec生成错误的结果

这是我现在想到的唯一一个例子,但我相信还会有其他情况下,多任务处理可能会使程序(mer)陷入麻烦(因为时间不是在重新进入时可能改变的唯一状态)

  • 有没有办法确保测量某个动作的时间效果良好
  • 哪些其他常见问题对多任务处理至关重要,需要考虑?(我没有考虑线程安全性——但可能存在一些常见问题)
编辑: 我更改了示例代码以使其更精确。 我想检查所花费的时间,以确保doSthElse()不会花费大约50毫秒,如果需要,我会寻找更好的解决方案

  • 有没有办法确保测量某个动作的时间效果良好
这取决于您的操作系统和权限级别。在某些系统上,对于某些特权级别,可以将进程或线程设置为具有优先级,以防止其被优先级较低的任何对象抢占。例如,在Linux上,您可以使用
sched_setscheduler
为线程提供实时优先级。(如果您真的很认真,还可以设置线程亲和力和SMP亲和力,以防止在运行线程的CPU上处理任何中断。)

您的系统还可以提供时间跟踪,以说明抢占的时间。例如,POSIX定义了
getrusage
函数,该函数返回一个包含
ru_-utime
(进程在“用户模式”下花费的时间)和
ru_-stime
(进程在“内核模式”下花费的时间)的结构。这些时间总和应为CPU在进程上花费的总时间,不包括进程暂停的时间间隔。请注意,例如,如果内核需要花时间代表进程进行分页,则不确定该时间中有多少(如果有的话)要花在进程上

无论如何,衡量某项关键行动所花费时间的常用方法是在其他闲置系统上重复计时(基本上是你的问题所呈现的方式),扔掉异常值测量值,然后取平均值(消除异常值后),或取测量值的中位数或第95个百分位数,取决于你为什么需要测量

哪些其他常见问题对多任务处理至关重要,需要考虑?(我没有考虑线程安全性——但可能存在一些常见问题)


太宽了。关于这个问题,已经有很多书了。

我认为你需要重新考虑“错误的结果”对时间差的意义。此代码将测量函数调用所用的时间。只有在没有操作系统中断的情况下才“正常”吗?如果必须从虚拟内存中检索内存页,这是否“好”呢?为什么这些结果是错误的?如果您想要代码执行的实际时间,那么结果是正确的。如果你想要别的东西,什么是别的东西?都是对的。更准确地说:我想知道在我的过程中使用了多少时间,例如解析一个文件。@StephanSchwarzmann这一点都不精确。这算不算等待I/O的时间?