Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 有没有办法在程序运行期间暂停操作系统调度?_C_Clock - Fatal编程技术网

C 有没有办法在程序运行期间暂停操作系统调度?

C 有没有办法在程序运行期间暂停操作系统调度?,c,clock,C,Clock,我有一个任务,我正在分析各种排序算法的运行时。我已经写了代码,但我认为这是一个不公平的比较 我的代码基本上获取排序完成前后的时钟时间,以计算经过的时间。但是,如果操作系统决定在特定排序算法的运行时更频繁地中断,或者如果它决定在线程返回时,应该给其他后台应用程序更多的时间域,该怎么办 我不是计算机科学专业的学生,所以我在这里可能不完全正确,但从我之前读到的内容来看,我担心这可能会对结果产生影响 我还意识到,如果操作系统调度暂停,程序挂起,那么可能会出现严重问题;我只是想知道这是否可能 这是不可能的

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

我的代码基本上获取排序完成前后的时钟时间,以计算经过的时间。但是,如果操作系统决定在特定排序算法的运行时更频繁地中断,或者如果它决定在线程返回时,应该给其他后台应用程序更多的时间域,该怎么办

我不是计算机科学专业的学生,所以我在这里可能不完全正确,但从我之前读到的内容来看,我担心这可能会对结果产生影响


我还意识到,如果操作系统调度暂停,程序挂起,那么可能会出现严重问题;我只是想知道这是否可能

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

如果您只想对流程进行精确的时间计数,我建议使用
time
命令。您可以在此处阅读:


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

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

在Linux中,您可以使用
isolcpus
参数来标记调度程序将不使用的CPU。你可以找到信息。我不确定最低内核版本是什么。

如果您使用它,您需要使用
sched_setaffinity
,将theread放在一个独立的CPU上,因为调度器不会将它放在那里。

在最新的POSIX系统上(基本上是Linux)如果您确保进程不在CPU之间迁移(例如,您可以设置其关联性),则可以与
CLOCK\u PROCESS\u CPUTIME\u ID
CLOCK\u THREAD\u CPUTIME\u ID
一起使用

clock\u gettime
返回的时间与这些参数之间的差异会导致进程/线程执行的确切时间。我提到的唯一陷阱是流程迁移,如手册所示:

CLOCK\u PROCESS\u CPUTIME\u ID
CLOCK\u THREAD\u CPUTIME\u ID
时钟在许多平台上都是使用来自CPU的计时器实现的(i386上的TSC,安腾上的AR.ITC)。这些寄存器在CPU之间可能不同,因此,如果进程迁移到另一个CPU,这些时钟可能返回假结果


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

只需将排序算法调用humdred次左右,然后将最后的时间除以100。或者将算法运行几次,并保持测量的最小(最佳)时间。暂停IO调度?包括页面错误、I/O、一切?双重引导到MS-DOS并在那里编译/运行算法?;-)这部分是开玩笑,但部分是认真的,因为没有调度程序来阻止你。不过,你还是得对中断做点什么。