多任务处理和测量时差

时间:2015-06-23 17:46:06

标签: 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 = getTime_usec() - start_usec;
    // end of critical section
    evalUsedTime( timeDiff_usec );
    sleep_msec( 10 );
  }
}

我希望此代码通常会为 timeDiff_usec 生成正确的结果,尤其是在 doSthElse() getTime_usec() don'的情况下这需要花费很多时间,因此OS调度程序很少会中断它们。

但是程序会在“关键部分”的某个地方不时被打断。上下文切换将执行它应该执行的操作,并且在这种情况下,程序将为 timeDiff_usec 生成错误的结果。

这是我现在想到的唯一例子,但我确信会有其他情况,多任务处理可能会使程序(mer)陷入困境(因为时间不是唯一可能在条目)。

  • 有没有办法确保衡量某项行动的时间是否正常?
  • 哪些其他常见问题对多任务处理至关重要且需要考虑? (我没有考虑线程安全 - 但可能存在常见问题)。

编辑: 我更改了示例代码以使其更精确。 我想检查花费的时间来确保doSthElse()不会花费大约50毫秒左右,如果确实如此,我会寻找更好的解决方案。

1 个答案:

答案 0 :(得分:1)

  
      
  • 有没有办法确保衡量某项行动的时间是否正常?
  •   

这取决于您的操作系统和您的权限级别。在某些系统上,对于某些权限级别,您可以将进程或线程设置为具有优先级,以防止它被优先级较低的任何内容抢占。例如,在Linux上,您可以使用sched_setscheduler为线程提供实时优先级。 (如果你真的很认真,你也可以设置线程亲和力和SMP关系,以防止在运行你的线程的CPU上处理任何中断。)

您的系统还可能会提供时间跟踪,以说明抢先花费的时间。例如,POSIX定义getrusage函数,该函数返回包含ru_utime的结构(进程在“用户模式”下花费的时间)和ru_stime(花费的时间量)在“内核模式”的过程中)。这些应该总计CPU花费在进程上的总时间,不包括进程被暂停的时间间隔。请注意,如果内核需要花费时间代表您的流程进行分页,则无法定义该流程向您的流程收取多少费用(如果有的话)。

无论如何,衡量一些关键行动所用时间的常用方法是重复计算时间(基本上就是你的问题所呈现的方式),在一个空闲的系统上,抛出离群值测量值,取平均值(消除异常值后) ,或取出测量的中位数或第95百分位,取决于您需要测量的原因。

  

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

太宽泛了。有关于这个主题的全书。