C 确定进程是否被抢占/阻止

C 确定进程是否被抢占/阻止,c,linux,C,Linux,在两个代码点之间,我是否可以判断进程是否已被内核抢占,或者更确切地说,是否有其他代码在同一处理器上运行过 //Point A some_type capture = some_capture(); . . . //Point B if( interrupted( capture ) ) 是否有任何我可以执行的系统调用,或者最好是可以读取的用户空间变量,可以实现一些捕获和中断 我正在尝试改进一些基准测试代码,并希望排除此类示例。通常我可以使用FIFO线程,但在某些情况下我不能。一般来说,我正在计

在两个代码点之间,我是否可以判断进程是否已被内核抢占,或者更确切地说,是否有其他代码在同一处理器上运行过

//Point A
some_type capture = some_capture();
.
.
.
//Point B
if( interrupted( capture ) )
是否有任何我可以执行的系统调用,或者最好是可以读取的用户空间变量,可以实现一些捕获和中断


我正在尝试改进一些基准测试代码,并希望排除此类示例。通常我可以使用FIFO线程,但在某些情况下我不能。一般来说,我正在计时的事情所占用的时间少于一个时间片,并且往往不会阻塞,因此,对它们何时执行的任何测量都不是对独立功能时间的准确测量。

我认为您不能这样做,但是,您可以调用sched_setscheduler为您的进程sched_FIFO调度策略和合适的非零优先级。这使得它成为一个实时任务,除了另一个可能没有的更高优先级的实时任务之外,不能被中断。

…刚才注意到您提到了FIFO线程,所以您可能已经知道了这一点。即使是SCHED_FIFO也不会阻止中断处理程序的运行。我确实在很多情况下使用FIFO,但有时出于各种原因,我会进行一些不可能或不可取的测试。因此,我们回到我最初的陈述,我认为你不能这样做。:-至少不是从用户空间。可能有内核级跟踪工具可以告诉您这一点,或者有某种方法可以禁用处理器上的调度和中断。海森堡·斯特鲁克说,对你的技术问题没有回答,因此我要发表评论:进行这种微观测量通常只有在一定的失败概率下才有可能。为什么你需要每次跑步的时间,而不是平均超过100或1000次?如果这真的是一项很短的任务,您需要进行调查,那么这应该是合适的。如果你单独测量这些数据,并且有一个问题,即一些测量点被打断,你应该清楚地看到两个不同的总体。问题是因为我做了很多次跑步。我同意,一次跑太短了。但是,当我运行1000个内核时,内核中断的可能性就会增加。这些中断极大地扭曲了数字,即使在大批量运行中也是如此。你必须用一些不太具侵入性的滴答数来衡量单个运行,并据此将它们分为捕捉到中断的运行和没有捕捉到中断的运行。现在我有点忽略了不太可能出现的结果。这是很难自动做到的-变化很高,但通常不足以通过统计数据轻松发现。我只是希望我能增加一个额外的工具来检测糟糕的测试。至于滴答数,这是我计时的方式,但对于我计时的许多事情来说,计时器的开销仍然太大,以至于没有大的运行大小。尝试和测量亚微秒的任何事情都是一件非常痛苦的事情。