performance - 编程竞赛的单任务

标签 performance operating-system multitasking

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

Given a single C++ source code file which compiles well in modern g++ and uses nothing more than the standard library, can I set up a single-task operating system and run it there?

EDIT: Following the comment by Chris Lively, I would have better asked: What's the easiest way you can suggest to try to tweak linux into effectively giving me a single-tasking behavior. Nevertheless, it seems like I did get a good answer although I did not phrase my question well enough. See the second paragraph in sarnold's answer regarding the scheduler.

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

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

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

最后一段中提出的方法当然只有在假设参赛者的程序是唯一运行的程序的情况下才是正确的,这就是为什么我想要一个单任务操作系统。

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

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

最佳答案

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

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

关于performance - 编程竞赛的单任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7863672/

相关文章:

c# - await Task.WhenAll 看似完成,但它永远不会到达下一行代码

javascript - page speed , yslow 工具是否足以了解网站组织和性能

Javascript创建函数以在其他函数之间共享变量

c# - 如何从Windows系统中彻底删除文件

c++ - 两台计算机必须有什么共同点才能运行相同的可执行文件?

iphone - 当我的应用程序在后台播放音频时,如何用我的应用程序图标替换 iPod?

ios:如何恢复基于 AVAsset 视频的写作 session

performance - 使用three.js和canvas渲染器渲染大量彩色粒子

c# - node.js vs ASP.NET Core 性能测试的意外结果

operating-system - 什么是页表条目大小?