单一任务编程比赛

时间:2011-10-23 00:59:31

标签: performance operating-system multitasking

我将从问题开始,然后继续解释需求:

  

鉴于单个C ++源代码文件在现代g ++中编译得很好并且只使用标准库,我可以设置单任务操作系统并在那里运行吗?

     

编辑:在Chris Lively的评论之后,我会更好地问:最简单的方法是建议尝试调整linux以有效地给我一个单任务行为。   尽管如此,我似乎没有得到一个好的答案,尽管我没有充分说出我的问题。请参阅sarnold关于调度程序的答案中的第二段。

动机: 在一些节目竞赛中,参赛者的节目与评分节目之间的沟通涉及大量非常短暂的互动。

因此,使用 getrusage 来衡量参赛者计划花费的时间是不准确的,因为getrusage通过以恒定间隔(通常大约每10ms一次)对过程进行采样来工作,这与持续时间相比过大每次互动。

另一种计时方法是使用类似* clock_gettime *的方法测量程序运行之前和之后的时间,然后减去它们的值。我们还应该减去在I / O上花费的时间,这可以通过使用LD_PRELOAD之类的东西来拦截printf和scanf,并通过检查每次调用printf之前和之后的时间来累积在每个函数中花费的时间。 / scanf(可以要求参赛者仅将这些功能用于I / O)。

最后一段中提出的方法仅适用于假设参赛者的程序是唯一运行的程序,这就是我想要单任务操作系统的原因。

要同时运行参赛者的程序和评分程序,我需要一种机制,当其中一个程序尝试读取输入和块时,运行另一个程序,直到它写入足够的输出。我仍然认为这是单任务,因为程序不会同时运行。在需要时会发生“上下文切换”。

注意:我知道存在额外的时序问题,例如CPU电源管理,但我想首先解决上下文切换和多任务处理的问题。

1 个答案:

答案 0 :(得分:2)

首先,我认为最符合您需求的最佳实际上是一种语言解释器 - 您可以设法跟踪“执行时间”一些专用单元中的程序,如“mems”表示存储器访问或“循环”表示不同指令的速度。他的MMIX中的Knuth The Art of Computer Programming可能提供了完全相同的功能,尽管Python,Ruby,Java,Erlang都是足够合理的解释器,如果你做足够的话可以提供一些指令数量/成本/内存访问成本-写作。 (但显然失去了C ++。)

另一种可能适合您的方法 - 如果非常小心地使用 - 是在SCHED_FIFOSCHED_RR实时处理类中运行编程问题。在其中一个实时优先级类中运行的程序将为系统上的其他进程生成,从而允许它们支配所有其他任务。 (务必在更高实时课程中运行sshd(8)sh(1),以便杀死失控的任务。)