有没有办法在程序的持续时间内暂停OS调度?

时间:2013-11-20 15:16:57

标签: c clock

我有一个分配,我正在分析各种排序算法的运行时间。我已经编写了代码,但我认为这是一种不公平的比较。

我的代码基本上抓住了排序结束前后的时钟时间来计算经过的时间。但是,如果操作系统决定在特定排序算法的运行时间内更频繁地中断,或者当它的线程重新启动时,它决定是否应该给予其他一些时域更多的时间域,该怎么办?

我不是CS专业,所以我在这里可能不完全正确,但从我之前读过的内容我担心这可能会对结果产生影响。

我也意识到如果暂停操作系统调度并且程序挂起,则可能存在严重问题;我只是想知道是否有可能。

3 个答案:

答案 0 :(得分:4)

通常,没有真正的理由。调度程序将略微增加执行时间,但如果代码运行几秒钟,则更改将很小 因此,除非您在同一台计算机上运行繁重的应用程序,否则这将增加测试的噪音量可以忽略不计。

在Linux中,您可以使用isolcpus参数来标记调度程序不会使用的CPU。您可以找到信息here。我不确定最小内核版本是什么 如果您使用它,则需要使用sched_setaffinity将您的内容放在隔离的CPU上,因为调度程序不会将其放在那里。

答案 1 :(得分:3)

不可能,不在用户空间代码中。否则,任何恶意进程都可能从其他人那里窃取CPU。

如果您只想为您的流程计算精确时间,我建议您使用time命令。您可以在此处阅读:What do 'real', 'user' and 'sys' mean in the output of time(1)?

快速回答:您很可能对user时间感兴趣,假设您的代码没有大量使用系统调用(这对于排序算法来说会很奇怪)

答案 2 :(得分:3)

在最新的POSIX系统(基本上是Linux)上,如果确保进程不在CPU之间迁移({1}},则可以clock_gettime使用CLOCK_PROCESS_CPUTIME_IDCLOCK_THREAD_CPUTIME_ID可以设置它的亲和力,例如)。

clock_gettime返回的时间与这些参数的差异导致进程/线程执行的确切时间。正如我所提到的那样,唯一的缺陷是流程迁移,如手册页所示:

  

使用来自CPU的计时器(i386上的TSC,Itanium上的AR.ITC)在许多平台上实现了 CLOCK_PROCESS_CPUTIME_ID CLOCK_THREAD_CPUTIME_ID 时钟)。这些寄存器在CPU之间可能不同,因此如果进程迁移到另一个CPU,这些时钟可能会返回伪结果

这意味着您不需要暂停所有其他进程来衡量程序的执行时间。