据我所知,抢占式多任务操作系统可以在任何“代码位置”中断进程。
给出以下代码:
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毫秒左右,如果确实如此,我会寻找更好的解决方案。
答案 0 :(得分:1)
- 有没有办法确保衡量某项行动的时间是否正常?
这取决于您的操作系统和您的权限级别。在某些系统上,对于某些权限级别,您可以将进程或线程设置为具有优先级,以防止它被优先级较低的任何内容抢占。例如,在Linux上,您可以使用sched_setscheduler
为线程提供实时优先级。 (如果你真的很认真,你也可以设置线程亲和力和SMP关系,以防止在运行你的线程的CPU上处理任何中断。)
您的系统还可能会提供时间跟踪,以说明抢先花费的时间。例如,POSIX定义getrusage
函数,该函数返回包含ru_utime
的结构(进程在“用户模式”下花费的时间)和ru_stime
(花费的时间量)在“内核模式”的过程中)。这些应该总计CPU花费在进程上的总时间,不包括进程被暂停的时间间隔。请注意,如果内核需要花费时间代表您的流程进行分页,则无法定义该流程向您的流程收取多少费用(如果有的话)。
无论如何,衡量一些关键行动所用时间的常用方法是重复计算时间(基本上就是你的问题所呈现的方式),在一个空闲的系统上,抛出离群值测量值,取平均值(消除异常值后) ,或取出测量的中位数或第95百分位,取决于您需要测量的原因。
哪些其他常见问题对多任务处理至关重要且需要考虑? (我没有考虑线程安全 - 但可能存在常见问题)。
太宽泛了。有关于这个主题的全书。