我知道抢占式多任务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)陷入困境(因为时间不是重新输入时唯一可能改变的状态)。
编辑:
我更改了示例代码以使其更加精确。
我想检查一下花费的时间,以确保doSthElse()不会花费大约50毫秒左右的时间,如果可以,那么我会寻找更好的解决方案。
最佳答案
这取决于您的操作系统和特权级别。在某些系统上,对于某些特权级别,可以将进程或线程设置为具有优先级,以防止优先级较低的任何事物抢占它。例如,在Linux上,您可以使用sched_setscheduler
赋予线程实时优先级。 (如果您真的很认真,还可以设置线程关联性和SMP关联性,以防止在运行线程的CPU上处理任何中断。)
您的系统还可以提供时间跟踪,以说明抢占的时间。例如,POSIX定义了getrusage
函数,该函数返回一个结构,其中包含ru_utime
(进程在“用户模式”下花费的时间)和ru_stime
(进程在“内核模式”下花费的时间)。这些应该是CPU在进程上花费的总时间,不包括进程挂起的时间间隔。请注意,例如,如果内核需要花费一些时间来代表您的进程进行分页,则不会定义该进程要花费多少时间(如果有的话)。
无论如何,衡量花费在某个关键 Action 上的时间的常用方法是在一个闲置的系统上重复计时(基本上是您的问题提出的方式),排除异常值,然后取平均值(消除异常值后),或者采用测量的中位数或第95个百分位数,具体取决于您为什么需要进行测量。
太宽泛。有整本关于这个主题的书。
关于c++ - 多任务处理和测量时差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31009854/