Multitasking and measuring time difference
我知道抢占式多任务OS可以在任何"代码位置"中断进程。
给出以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 | 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()不需要太多时间的情况下,因此它们很少被OS调度程序打断。
但是程序有时会在"关键部分"的某个地方被打断。上下文切换将执行预期的操作,并且在这种情况下,程序仍然会为timeDiff_usec产生错误的结果。
这是我目前唯一想到的例子,但是我敢肯定,在其他情况下,多任务处理可能会使程序(mer)陷入困境(因为时间不是重新输入时唯一可能改变的状态)。
- 有没有办法确保测量某个动作的时间正常?
- 还有哪些其他常见问题对于多任务处理至关重要,需要加以考虑吗? (我没有考虑线程安全性-但可能存在一些常见问题)。
编辑:
我更改了示例代码以使其更加精确。
我想检查一下花费的时间,以确保doSthElse()不会花费大约50毫秒左右的时间,如果可以,那么我会寻找更好的解决方案。
- Is there a way to ensure that measuring the time for a certain action works fine?
这取决于您的操作系统和特权级别。在某些系统上,对于某些特权级别,可以将进程或线程设置为具有优先级,以防止优先级较低的任何事物抢占它。例如,在Linux上,您可以使用
您的系统还可能提供时间跟踪,以说明抢占的时间。例如,POSIX定义了
无论如何,衡量花费在某个关键动作上的时间的常见方法是在一个闲置的系统上重复计时(基本上是您的问题的提出方式),排除异常值,然后取平均值(消除异常值后),或者采用测量的中位数或第95个百分位数,具体取决于您为什么需要进行测量。
Which other common issues are critical with multitasking and need to be considered? (I'm not thinking of thread safety - but there might be common issues).
太宽泛。有整本关于这个主题的书。