如何在内存/ CPU时间有限的Windows下运行程序?

时间:2009-02-10 13:22:01

标签: windows

首先是this question,然后是this question,现在又导致了现在的{{3}}。 :)

任务如下:制作一个Windows程序,在有限的环境中运行另一个程序。另一个程序不可信任,因此它必须为hackish代码做好准备。更具体地说:

  • 将可用内存限制为某个X MB(作为参数给出);
  • 将可用执行时间限制为约X毫秒(作为参数给出)。请注意,这是内核时间+用户时间,但不是空闲时间。另一方面,空闲时间也必须受到限制,因此程序无法Sleep()无限期。
  • 程序终止时,尽可能精确地报告实际花费的CPU时间。毫秒是好的,几厘秒可以接受,少于那不会很好。 CPU周期是理想的。
  • 如果程序崩溃,请报告有关崩溃的一些信息(越多越好,但不要过度使用堆栈跟踪等)。
  • 最好捕获程序的所有输出并报告;
  • 该程序应该只使用当前目录,加上SYSTEM32的一些强制.DLL(如kernel.dll,user32.dll等)。尽可能限制访问其他任何内容。不应该访问诸如注册表和网络之类的东西(除非强制性的.DLL需要它)。访问越少越好。

这将是计算奥林匹克支持软件所必需的。该程序将在中央服务器上运行参与者提交的内容,因此您可以期待任何相关内容。崩溃将是常规的,也可以预期一些黑客攻击。

那么 - 你将如何制作这样的节目?你会用什么?在之前的主题(见上文)中,很明显附加为调试器是一个坏主意,尽管我可能只是太笨拙了。

3 个答案:

答案 0 :(得分:5)

您正在构建与IIS相同的流程模型 - 很有趣!我会使用IIS使用的相同工具,它相对强大,可以防止黑客入侵,并且可以将系统划分为多个并发作业。

您可以使用Win32 Jobs为内存,cpu,线程设置配额,并且可以为要运行的不同进程设置安全上下文,从而限制对文件系统的访问。

对于监控,我会查看WMI

对于挂起或崩溃时的堆栈跟踪,我再次使用了Microsoft的ADPlus

要捕获控制台输出,请查看创建Child Process with Redirected Input Output.

关于安全限制,请创建低权限用户帐户并以该用户身份运行作业/进程。

答案 1 :(得分:0)

虚拟化解决方案可以解决这个问题。也许您可以将您的解决方案基于VMWare(或等效的)并启动单独的虚拟机(每个进程一个)。您将获得良好的隔离,控制内存/ CPU使用和报告。每个进程的包装操作系统的开销很大,但是根据项目的要求,这可能是可以接受的。

答案 2 :(得分:0)

  • 将可用内存限制为某个X MB(作为参数给出); 使用VMWare或类似的虚拟环境
  • 将可用执行时间限制为约X毫秒(作为参数给出)。请注意,这是内核时间+用户时间,但不是空闲时间。另一方面,空闲时间也必须受到限制,因此程序无法无限地休眠()。
  • 程序终止时报告实际花费的CPU时间; 构建程序代码。 (连接CPU电源
  • 如果程序崩溃,请报告有关崩溃的一些信息(越多越好,但不要过度使用堆栈跟踪等)。 构建程序代码。 (例外处理)
  • 最好捕获程序的所有输出并报告; 构建程序代码(日志文件)。
  • 该程序应该只使用当前目录,加上SYSTEM32的一些强制.DLL(如kernel.dll,user32.dll等)。尽可能限制访问其他任何内容。不应该访问诸如注册表和网络之类的东西(除非强制性的.DLL需要它)。访问越少越好。 构建程序代码。 (如果您的程序不使用注册,则不会使用它。