【发布时间】: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