【发布时间】:2011-03-16 10:57:58
【问题描述】:
我为脚本语言编写了编译器和解释器。解释器是一个 DLL(“引擎”),它在单个线程中运行,可以加载许多 100 或 1000 的已编译字节码应用程序,并将它们作为一组内部进程执行。有一个主循环,在将一个加载到下一个进程之前,从每个加载的应用进程中执行一些指令。
编译后的应用程序中的字节码指令可以是低级指令(pop、push、add、sub 等),也可以是对外部函数库的调用(大部分工作都在这里完成)。这些外部库可以回调引擎使内部进程进入睡眠状态,等待外部函数(可能在接收到事件之后)再次唤醒内部进程的特定事件。如果所有内部进程都处于睡眠状态(大多数情况下都是这样),那么我也可以让引擎进入睡眠状态,从而将 CPU 交给其他线程。
但是,没有什么可以阻止某人编写一个像这样执行紧密循环的脚本:
当(1) x=1; 结束
这意味着我的主循环永远不会进入睡眠状态,因此 CPU 会达到 100% 并锁定系统。我希望我的引擎尽可能快地运行,同时仍处理 Windows 事件,以便在遇到类似于上述的紧密循环时其他应用程序仍能响应。
所以我的第一个问题是如何将代码添加到我的主循环中,以确保在不减慢应该以尽可能快的速度运行的主引擎的情况下处理 Windows 事件。
另外,如果能够设置我的引擎可以使用的最大 CPU 使用率,并通过调用偶尔的 Sleep(1) 来降低 CPU 使用率,那就太好了。
所以我的第二个问题是如何将 CPU 使用率降低到所需的水平?
引擎是用 Borland C++ 编写的,并调用 win32 API。
提前致谢
【问题讨论】:
-
如果您正在制定一个协作多任务方案,而脚本不合作 - 您真的应该强制执行吗?如果这是您想要的,请建立一个抢占机制。
-
恕我直言,你要倒退一步(ala windows 3.1)。您拥有完整的多进程和多线程操作系统。为什么不让每个脚本在它自己的线程中运行并管理这些线程。操作系统将负责执行上下文切换并为每个脚本分配处理器时间。然后,您可以控制线程优先级并管理线程生命周期。对于如图所示的无限循环,您可以在引擎上采取一些步骤来终止有问题的线程,即使您不这样做,这也永远不会阻止其他脚本运行。
-
肖恩,你似乎是新来的:欢迎 :) 距离最后一个答案发布已经有几天了。您应该对您认为有用的答案进行投票(单击答案左上角数字上方的三角形),如果有任何答案很好地回答了您的问题,请将其标记为已接受的答案(单击勾号。)我们付出了很多努力在这里回答问题,很利他,但能得到积分的“奖励”也不错。
标签: windows multithreading winapi cpu-usage