51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 6157|回复: 3
打印 上一主题 下一主题

[原创] 准确控制CPU使用率不可能

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2007-7-22 13:29:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Windows下能用:

1.Performance Counters Functions系列函数(示例)或ntdll.dll中未公开的API-NtQuerySystemInformation获得CPU使用率或者WMI(Windows Management and Instrumentation) 获得多核CPU使用率。当超过指定值时就Sleep,通过调整Sleep的时间能够控制CPU不超过阀值,当然CPU使用率肯定是有抖动的。

2.作业(Job)-限制进程的CPU使用率,详细请查看Windows核心编程》第五章。由于多任务的实现,Windows在某一时点只运行一个程序,这个时段大约是20毫秒,然后切换到另一个程序,使得"同时"执行多个程序成为可能。所以,所谓CPU消耗就是一个时间函数。具体来看看例子:某个应用程序以10秒为周期使用了5秒钟的CPU时间,那么,平均CPU使用率就是50%。以24小时为周期,就是12小时,如此等等。所以你可以以百分比为度量单位限制CPU使用。技巧就在于选择合适的周期。

3.设置SetPriorityClass进程SetThreadPriority线程优先级, 并且使用死循环,让程序始终占用资源,然后中途使用WaitForSingleObject,Sleep等函数来等待或者暂缓线程的执行,用来释放资源。如果希望准确控制某线程在某时刻占用多少资源,应该说是没有这种可能的,WINDOWS是一个分时抢先任务式的操作系统,系统会随时在任意线程之间切换,唯一可以控制的,高优先级的线程优先执行。


执行一个程序,调用CreateProcess激活程序产生一个进程(PDB),系统为此进程建立一个主执行线程(primary thread),执行线程(TDB)才是CPU时间的分配对象。进程拥有优先权等级(priority class),可以在CreateProcess 参数中的dwCreationFlags设定,dwCreationFlags表示创建进程的优先级类别(idle、normal、high、realtime)和进程的类型(控制台进程、调试进程等)。执行线程基本上继承自其父进程的优先权等级,然后再加上CreateThread参数中的dwCreationFlags微调差额(-2~+2)。获得的结果便是执行线程的base priority,范围从0~31数值越高优先权越高。


RAM可以alloc或者memset来申请块,但CPU的运行机制却跟RAM完全不同,实现跟RAM那样精确的控制实际上不行的。


现代的OS都是分时的(除了实时系统),仍受限于OS的分时性。建议不了解的多看看操作系统原理,个人可以做试验去验证




[ 本帖最后由 xiaoshancom 于 2007-8-5 14:00 编辑 ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2007-7-22 13:41:42 | 只看该作者
学习了。
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2007-7-23 11:12:30 | 只看该作者
说得好
精确控制是较难
控制申请的内存较容易
呵呵
VC中申请就OK了
回复 支持 反对

使用道具 举报

该用户从未签到

4#
 楼主| 发表于 2010-3-10 14:54:12 | 只看该作者
Linux上却是可以控制的 
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-8 16:51 , Processed in 0.062847 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表