【问题标题】:Single-Tasking for programming competitions编程竞赛的单任务
【发布时间】:2011-10-23 00:59:30
【问题描述】:

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

给定一个在现代 g++ 中编译良好并且只使用标准库的 C++ 源代码文件,我可以设置一个单任务操作系统并在其中运行吗?

编辑:根据 Chris Lively 的评论,我最好问一下:您可以建议尝试调整 linux 以有效地为我提供单任务行为的最简单方法是什么。 尽管如此,似乎我确实得到了一个很好的答案,尽管我的问题表述得不够好。请参阅 sarnold 关于调度程序的回答中的第二段。

动机: 在一些编程比赛中,参赛者的程序和评分程序之间的交流涉及大量非常短的交互。

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

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

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

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

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

【问题讨论】:

  • 不确定这属于这里。 “你能做点什么”类型的问题几乎总是得到肯定的回答。这个问题很模糊。我建议您可以先尝试实现这一点,如果/当您遇到问题时,请在此处发布您的问题的确切性质以寻求帮助。
  • 您是在以举办比赛的人的身份提问吗?还是作为参赛者?
  • @Chris:我现在稍微改变了措辞,使其尽可能具体。感谢您的评论。
  • @Mike:我是作为举办 C++ 编程竞赛的人问的。

标签: performance operating-system multitasking


【解决方案1】:

首先,我认为最适合您需求的最佳实际上是一种语言解释器——您可以使用它来跟踪“执行时间”程序的一些特制单位,如“mems”来表示内存访问或“周期”来表示不同指令的速度。 Knuth 的MMIX 在他的The Art of Computer Programming 中可能正好提供了该功能,尽管 Python、Ruby、Java、Erlang 都是足够合理的解释器,如果您进行足够的重写,它们可以提供一些指令数/成本/内存访问成本。 (但显然失去了 C++。)

另一种可能对您有效的方法(如果使用得非常小心)是在SCHED_FIFOSCHED_RR 实时处理类中运行您的编程问题。在这些实时优先级之一中运行的程序将不会为系统上的其他进程让步,从而允许它们支配所有其他任务。 (请务必在 更高 实时类中运行您的 sshd(8)sh(1),以允许您杀死失控的任务。)

【讨论】:

  • 由于我不能允许不使用 C++ 运行比赛,我将尝试第二段建议的方法。
猜你喜欢
  • 2014-06-06
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多