51Testing软件测试论坛

标题: 准确控制CPU使用率不可能 [打印本页]

作者: xiaoshancom    时间: 2007-7-22 13:29
标题: 准确控制CPU使用率不可能
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的分时性。建议不了解的多看看操作系统原理,个人可以做试验去验证


原帖:http://fafeng.blogbus.com/logs/6908889.html


[ 本帖最后由 xiaoshancom 于 2007-8-5 14:00 编辑 ]
作者: Zee    时间: 2007-7-22 13:41
学习了。
作者: 423799223    时间: 2007-7-23 11:12
说得好
精确控制是较难
控制申请的内存较容易
呵呵
VC中申请就OK了
作者: xiaoshancom    时间: 2010-3-10 14:54
Linux上却是可以控制的 




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2