www.jybase.net - 寂涯网络学习基地

404 Error: 抱歉, 您所查找的页面不存在, 可能已被删除或您输错了网址!

404错误,没有发现你要找的页面, 经砖家仔细研究结果如下:

首 页 | 在线视频观看 | 系统综合 | 网站相关 | 教程共享 | 网赚教程共享 | 精品软件下载 | 网盘搜


























免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 系统综合 > windows > 限制单个进程的CPU占用率过高

限制单个进程的CPU占用率过高

时间:2011-11-15 22:58来源:未知 整理:寂涯网络 点击:

对于买不起多核处理器的朋友,最怕遇到的事情就是单个进程的CPU 占用率过高。比如
我的 CPU 已经是Core 2系列移动CPU的旗舰产品X9100,但是在视频转换时上硬件论坛(图
片很多)顺便再打开个QQ视频聊天,感觉就非常不爽。由于我的笔记本电脑的主板不支持  

四核心处理器,于是我只能从“软”的方面入手,限制单个进程的CPU占用率。
试图限制 CPU 占用率不是什么新鲜的想法。记得早在2004年时,Intel出了Prescott
核心的 Pentium 4处理器,这种核心的处理器的特点是,普及了超线程技术(之前超线程技
术只应用在顶级的NorthWood核心的Pentium 4上)。超线程技术(HT)能把一颗物理核心
映射成两颗逻辑核心,提高了多线程任务的效率。说白了就是,当出现了一个狂占CPU核心
的线程时,电脑不会“卡死”。(说句题外话,Core 2系列CPU没有超线程技术,但是现在
的 Core i系列CPU又重现了超线程技术,不过换了个马甲,叫做SMT,中文译名是“并发
多线程”)。而同样是Prescott核心的Celeron D处理器不仅被阉割了前端总线和二级缓存,
连超线程技术也一并没了踪影。于是人们在痛骂INTEL不厚道的同时,也在寻找替代超线程
技术的办法。就在此时,出现了一款号称能替代超线程技术的软件,它能限制单一进程的
CPU 占用率,这个软件还一度登上了华军的软件下载排行榜。不过经网友测试,又是骂声一
片,因为它只是通过“优先级”来限制进程的CPU占用率。后来,这个软件就从下载排行榜
消失了,网上再也没有出现过类似的软件。
为什么通过优先级来限制单个进程的CPU占用不行呢?我们一测便知。首先打开Super
PI(最著名的CPU单核性能测试工具,每当Intel/AMD发布新产品,总能看到各大媒体的测
试文章中看到它的身影)进行1M 测试(计算PI后104 万位)。我的CPU 主频是
266*13=3458MHz,核心电压 1.263V。当进程的优先级别为“普通”时,耗时13.650s,当进
程优先级为“低”时,耗时13.689s。而运行时的CPU 占用率(指“任务管理器”显示的进
程 CPU占用率),一直维持在49%左右。
很明显,调节进程优先级是无法解决问题的。于是我又询问了一些网友,得到两个答案:
一是通过 Hook KiSwapContext来限制某个进程的线程获得CPU时间片,二是通过作业来限
制进程的 CPU 占用率。不过很可惜,这两个方案都不可行。第一个方案就不用说了,Hook
不稳定,特别是这种未公开且调用很频繁的底层函数。第二个方案的说法有歧义,作业确实
能限制进程的使用CPU,不过是:如果进程使用了一定数量的CPU 时间片,就把进程给杀掉
(详情请参见《Windows Via C/C++》,作者是Jeffrey Richter和 Christopher Nasarre)。 
某天中午我突发奇想,决定交替使用NtSuspendProcess和 NtResumeProcess来限制单
个进程的 CPU 占用率。首先,一旦进程被暂停,自然就不能占用CPU 了,其次,暂停进程只
会拖慢进程工作,不会扰乱进程工作。我随后就编码测试,结果证明,这个看似脑残的想法
竟然十分有效。

解决方案
 
整个解决方案的流程很简单,只有两步:  
1.获得要限制CPU 占用率的进程的句柄;
2.每隔 50ms,依次调用 NtSuspendProcess 和 NtResumeProcess。比如第 50ms 调用了
NtSuspendProcess,第100ms就调用NtResumeProcess。第150ms调用NtSuspendProcess,
第 200ms就调用NtResumeProcess,如此类推下去。

程序代码如下:

Private Declare Function  OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess
As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function  NtSuspendProcess Lib "ntdll.dll" (ByVal hProc As Long)
As Long
Private  Declare  Function  NtResumeProcess Lib "ntdll.dll" (ByVal hProc As Long) As Long
Private hProc As Long
Private Sub LimitCPU_Click()
    hProc = OpenProcess(&H1F0FFF, 0, CLng(Text1.Text))
    WorkingTimer.Interval = 50 '时间间隔为50ms
    WorkingTimer.Enabled = True '开始限制CPU占用率
End Sub
Private Sub WorkingTimer_Timer()
Static x As Long
If x = 0 Then
    x = 1
    NtSuspendProcess hProc

本页地址 http://www.jybase.net/windows/20111115618.html

百度搜索更多

谷歌搜索更多

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商