加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

如何限制进程在Windows上的CPU使用率? (需要代码,而不是应用程

发布时间:2020-12-14 02:09:36 所属栏目:Windows 来源:网络整理
导读:有些程序可以限制 Windows中进程的CPU使用率.例如 BES和 ThreadMaster.我需要编写自己的程序,它与这些程序具有相同的功能,但具有不同的配置功能.有人知道如何完成CPU限制进程(代码)吗?我不是在谈论设置进程的优先级,而是如何将其CPU使用率限制为例如15%,即
有些程序可以限制 Windows中进程的CPU使用率.例如 BES和 ThreadMaster.我需要编写自己的程序,它与这些程序具有相同的功能,但具有不同的配置功能.有人知道如何完成CPU限制进程(代码)吗?我不是在谈论设置进程的优先级,而是如何将其CPU使用率限制为例如15%,即使没有其他进程竞争CPU时间.

更新:我需要能够限制任何已经运行的进程以及我没有源代码访问权限.

解决方法

很简单,它可以像这样工作:

>使用一些合理的小等待时间(可能为100毫秒)创建一个定期的等待计时器.通过调用GetProcessTimes一次获取每个相关进程的“最后”值.
>永远循环,阻止计时器.
>每次醒来时:

>如果GetProcessAffinityMask返回0,则调用SetProcessAffinityMask(old_value).这意味着我们在上一次迭代中暂停了该过程,现在我们给它一个再次运行的机会.
>否则调用GetProcessTimes以获取“当前”值
>调用GetSystemTimeAsFileTime
>通过从当前减去最后一个来计算delta
> cpu_usage =(deltaKernelTime deltaUserTime)/(deltaTime)
>如果这比您想要的更多,则调用old_value = GetProcessAffinityMask,后跟SetProcessAffinityMask(0),这将使进程脱机.

这基本上是在内核中运行的调度程序的一个非常原始的版本,在userland中实现.如果它使用的CPU时间比你想象的要多,那么它会使进程“休眠”一小段时间.更复杂的测量可能会持续一秒或5秒(并且可能是可取的).

您可能想要暂停该进程中的所有线程.但是,除非你确切知道程序正在做什么,否则不要使用优先级并且不使用SuspendThread是很重要的,因为这很容易导致死锁和其他令人讨厌的副作用.例如,在另一个线程仍在运行并尝试获取同一对象时,暂停一个持有临界区的线程.或者想象你的进程在挂起十几个线程的过程中被换掉,剩下一半在运行,另一半在死.

另一方面,将关联掩码设置为零只意味着从现在开始,进程中没有任何单个线程在任何处理器上获得更多时间片.重置亲和力同时给予原子 – 所有线程都可以再次运行.

不幸的是,SetProcessAffinityMask不像SetThreadAffinityMask那样返回旧的掩码,至少根据文档.因此,需要额外的Get …调用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读