我知道抢占式多任务OS可以在任何“代码位置”中断进程。

给出以下代码:

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()不需要太多时间的情况下,因此它们很少被操作系统调度程序打断。

但是程序有时会在“关键部分”的某个地方被打断。上下文切换将执行预期的操作,并且在这种情况下,程序仍然会针对 timeDiff_usec 产生错误的结果。

这是我目前唯一想到的示例,但是我敢肯定,在其他情况下,多任务处理可能会使程序(mer)陷入困境(因为时间不是重新输入时唯一可能改变的状态)。
  • 是否有办法确保测量某个 Action 的时间正常?
  • 其他哪些常见问题对于多任务处理至关重要,还需要考虑吗? (我没有考虑线程安全性-但可能存在一些常见问题)。

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

    最佳答案



    这取决于您的操作系统和特权级别。在某些系统上,对于某些特权级别,可以将进程或线程设置为具有优先级,以防止优先级较低的任何事物抢占它。例如,在Linux上,您可以使用sched_setscheduler赋予线程实时优先级。 (如果您真的很认真,还可以设置线程关联性和SMP关联性,以防止在运行线程的CPU上处理任何中断。)

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

    无论如何,衡量花费在某个关键 Action 上的时间的常用方法是在一个闲置的系统上重复计时(基本上是您的问题提出的方式),排除异常值,然后取平均值(消除异常值后),或者采用测量的中位数或第95个百分位数,具体取决于您为什么需要进行测量。



    太宽泛。有整本关于这个主题的书。

    关于c++ - 多任务处理和测量时差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31009854/

    10-10 12:26