如何用C实现让CPU占用率保持50%(例如用资源管理器查看)

来自:    更新日期:早些时候
如何编写一段小程序,让windows任务管理器cpu的占用率显示为50%?~

void fun(){int busyTime = 10;int idleTime = busyTime * 1.0; //调整这个1.0的值,以达到50%的标准,不同的计算机上是不同的。int ret = SetThreadAffinityMask(GetCurrentThread(),0x00000001);//使这个程序跑在第一个CPU核心INT64 startTime = 0;while (1){startTime = GetTickCount();while((GetTickCount() - startTime) 基本思想还是死循环,不过在循环中加上Sleep调用降低占用率。
详细可以查看《编程之美》第一章,,这是以前微软的面试题

将CPU使用率控制在50方法:
1、同时按住键盘上Ctrl+Alt+Delete,点击“启用任务管理器(T)”就可以看到CPU使用率是多少了。(这里的CPU使用率不高,因为没有运行游戏,后台程序也没有打开很多。)

2、按组合键Win+R进入运行窗口输入“msconfig”点击“启动”,把不需要的程序禁用掉,就可以减少CPU的使用率了。

先说说我在没查阅任何资料之前的做法:
这里要先明确一点, 任务管理器(taskmgr)里面显示50%并非意味着当前cpu真就工作在一半的频率下, 仔细观察可以发现, taskmgr的cpu使用率图表是周期性刷新的, 也就是说每经过一个interval期间, cpu活动(执行指令)的时间和空闲(挂起)时间刚好相等的话, 那么就可以认为cpu占用率为50%, 表面上看就可以认为cpu的运行频率降低了(实际上没有).
有了上面的认识, 就可以得到一个大致的思路: 在程序中首先执行一定规模的代码, 然后调用Sleep()函数让线程挂起X(ms), 如此周而复始, 如果代码执行花费的时间和挂起时间大致相等, 那么从一个interval来看, cpu占用率正好就是50%. 有了这个初步想法, 那么难点就在于如何估算执行代码所花费的时间了, 要执行一定规模的的代码, 最简单的方法就是写一个busy loop(也就是空循环), 比如for(i = 0; i < n; i++);如果能合理估算出这段代码的运行时间, 那么就可以知道需要挂起多长时间了.
之所以选用busy loop而不是其他api之类的, 是因为它不需要调用任何privilege instruction(没有io操作等), 这样就不会在运行中影响内核时间, 因为内核在运行privilege instruction时我们是无法控制的, 要使得50%的曲线更加平滑, 就应该尽量减少uncontrolable的内核时间. 所以busy loop是最简单最容易估算的代码段了.
接下来是估算: 分析for(i = 0; i < n; i++);可以大致推算出每次循环需要5行汇编代码
loop:
mov dx i
add dx 1
mov i dx
cmp i n
jmp loop (很久以前学的汇编, 忘记了那个判断大小后跳转的语句怎么写了...凑合一下吧)
我的cpu是p4 2.4ghz, 等于2.4 * 10的9次方个时钟周期每秒, 记得以前上微机原理时说现代cpu每个时钟周期可以执行2条以上的代码, 那么我就取平均2条, 于是让 (2400,000,000 * 2) / 5 = 960000000(循环/秒), 也就是说, cpu一秒钟可以运行那个循环960000000次. 不过我们还是不能简单地将n = 960000000, 然后Sleep(1000)了事. 因为windows并不是一个独占的实时系统, 而是一个抢先式多任务系统, 分配给某个线程的运行时间片是会被其他更高优先级的线程抢先的, 而且taskmgr的刷新率也小于1s, 如果我们让cpu工作1s, 挂起1s, 波形很有可能就是呈现锯齿状的, 先达到一个峰值(大于>50%), 然后跌到一个很低的占用率! 于是我尝试着降低两个数量级, 令n = 9600000, 而Sleep(10). 用10ms是因为它不大也不小, 1ms的话会造成线程频繁地被唤醒和挂起, 无形中又是增加了内核时间的不确定性影响. 可以得到代码如下:
#include <stdio.h>

int main()
{
for(;
{
for(i = 0; i < 9600000; i++);
Sleep(10);
}
return 0;
}

编译, 尽量关闭其他应用程序, 停掉能停的服务, 然后运行, Bingo! 在我的机器上, 已经显示cpu在50%附近了, 但是还有小幅度抖动, 此时适当调整n的大小, 几次尝试运行后就可以得到一个相对平滑的结果了!
为了验证我的推算正确性, 我又找了几台机器试了一下, 发现不同的cpu得到的结果会有所不同, 在一个p4 3.2ghz HT的cpu上, 关掉HT功能, 得到7680000 6ms是比较好的结果, 同时还发现一个好玩的现象, 就是开了HT功能后, 就不用Sleep()函数了, 直接写一个无限循环就可以让cpu跑在50%左右, 这可谓是最简单的方法 :), 而在迅驰和mobile系列cpu上由于运行频率会动态改变, 所以实现起来估算和实际情况出入比较大. 在程序运行起来后, 在taskmgr里面将它的优先级设置为最高(减少争用)也可以一定程度上让波形平滑一些. 而打开内核时间的显示后可以发现, 波形的抖动基本上都是由内核活动影响的.
根据这个原理, 让cpu波形维持在50%以外的数值也不是不可能的, 关键是让循环次数和挂起时间进行匹配, 而且它们的数量级还与cpu时间片分配和taskmgr波形刷新周期有关. 先估算一个值, 然后根据比例放大或者缩小, 再进行细微调整, 找到两个合适的数值不是难事. 而且, 有了根据这个原理, 还可以让cpu波形呈现sin()函数的形式, 比如先对0'~180'间取10'区间进行取样, 得到一个函数值数组, 然后根据数组的值对busy loop中的循环数和挂起时间进行换算修改, 从理论上来说是这肯定可行的, 不过指令数一多一复杂估算的精确性就会降低.

为了了解taskmgr的工作原理, 我查阅了一下相应的api资料, 发现两个函数QueryPerformanceFrequency()和QueryPerformanceCounter()可以精确得到一段代码的运行时间, 于是想到可以构造两个相同的大busy loop, 先在程序开头算出运行所需的精确时间, 然后用它来对Sleep()函数进行赋值, 这样也可以实现某种意义上的自动化(不用估算了XD...)
修改程序如下:
#include <stdio.h>

int main()
{
int i = 96000000, j = 0;
LARGE_INTEGER freq = {0};
LARGE_INTEGER start = {0};
LARGE_INTEGER end = {0};
DWORD elapse = 0;

QueryPerformanceFrequency(&freq);
printf("freq = %u\n", freq.QuadPart);
QueryPerformanceCounter(&start);
QueryPerformanceCounter(&end);
LONGLONG overhead = end.QuadPart - start.QuadPart;
printf("overhead = %d\n", overhead);

QueryPerformanceCounter(&start);
for(i = 0; i < 9600000; i++);
QueryPerformanceCounter(&end);
LONGLONG temp = (end.QuadPart - start.QuadPart - overhead);
printf("temp = %d\n", temp);
elapse = (DWORD)(((double)temp / (double)freq.QuadPart) * 1000.0);
printf("elapse = %lf\n", temp2);

for(;
{
for(i = 0; i < 9600000; i++);
Sleep(elapse);
}

return 0;
}

不过精确计算的结果似乎并不能得到更平滑的图像, 因为我甚至连两次调用api的花费都减掉了, 也许是过犹不及吧...总之我实验的结果是比较粗糙.

最后总结一下两个心得:
1. 尽量减少sleep/aweak的频率和花费, 如果频繁发生的话影响会很大.
2. 尽量不要调用system call(i/o这些privilege instruction), 因为它会导致很多uncontrolable的kernel time.
3. 由于抢先式多任务的争用性质, 想要精确控制曲线几乎是不可能的...
(不知这个结论是不是很绝对, 如果有办法用hack的方法hook入taskmgr的函数调用点, 修改它的返回值, 那么想显示什么波形就显示什么波形了, 我是没有功力做这么"伟大"的事情了...)

用相当多的嵌套循环。

呵呵
问题相当有创意
学习


如何用C实现让CPU占用率保持50%(例如用资源管理器查看)视频

相关评论:
  • 18253639006我的电脑cpu占用率老是接近100%是怎么回事?
    郗珊矿相信你的一定遇到过电脑动弹不得的时候,或许是只能眼看鼠标滑动而不能进行任何操作的时候,很多人都会经常遇到这样的问题:CPU占用率100%改如何解决,本文将从多个角度给你全方面的解析,希望阅读完本文希望在今后你遇到问题的时候能够带给你一些帮助。CPU经常性占用率100% 1、驱动没有经过认证,造成CPU资源占用100%。大...

  • 18253639006电脑CPU使用率总是显示100%是什么情况!
    郗珊矿相信你的一定遇到过电脑动弹不得的时候,或许是只能眼看鼠标滑动而不能进行任何操作的时候,很多人都会经常遇到这样的问题:CPU占用率100%改如何解决,本文将从多个角度给你全方面的解析,希望阅读完本文希望在今后你遇到问题的时候能够带给你一些帮助。CPU经常性占用率100% 1、驱动没有经过认证,造成CPU资源占用100%。大...

  • 18253639006如何设置一个进程告警,当该进程cpu使用率达到了95
    郗珊矿高CPU使用率也可能表明应用程序的调整或设计不良。优化应用程序可以降低CPU的使用率。CPU占用率高原因操作系统或杀毒软件的自动更新当操作系统或是杀毒软件在网路上检测到有更新模组时,便自动更新了。此时会占用大量CPU。[2]解决办法:将更新方式由“自动”改为“手动”。不过改变设置后,要记得时常给系统...

  • 18253639006linuxcpu占用率怎么看linuxcpu占用率
    郗珊矿最后欢迎大家关于这个问题畅所欲言,有喜欢我的记得关注下哦,每天为大家分享与解答我的想法与见解哦。rabbitmqcpu使用率和什么相关?x86_64,linux下,测试官网发布的RabbitMQ-c实现的客户端代码,其中amqp_listen.c编译执行后监听收RabbitMq消息,发现CPU占用率非常高,几乎在99%占用率而RabbitMQ服务端...

  • 18253639006电脑超频是什么意思?有什么危害吗
    郗珊矿任何一个对计算机硬件感兴趣的发烧友对超频都一定不会陌生,但是更多PC的使用者们可能对此并不十分清楚,所以什么是超频的这个问题,还是先向大家讲述一下吧! 严格意义上的超频是一个广义的概念,它是指任何提高计算机某一部件工作频率而使之工作在非标准频率下的行为及相关行动都应该称之为超频,其中包括CPU超频、主板...

  • 18253639006物理内存被大量占用而CPU占用率很小的原因是什么。
    郗珊矿CPU使用率与内存的占用率没有任何关系。有些程序可以把CPU满载却基本不占内存,而有些则可以塞满内存而基本不需要CPU工作。内存只不过是CPU处理数据的仓库。某软件有功能A、B、C三种,运行时把A、B、C所需要的数据都加载入内存;但是实际使用可能只会用到A的一小部分简单功能,那么就会变得内存占用大...

  • 18253639006为什么电脑一开机后CPU使用量就是100%?
    郗珊矿电脑开机CPU占用率太高的解决办法如下:电脑开机CPU占用过高可能与开启启动项过多有关,建议关闭一些不必要的开机启动项,减少内存占用。2.在安全软件中的【开机时间管理】可以看到各个启动项目的耗时,根据自己的需要,关闭一些不必要的启动项目,既可以加速开机速度,也可以避免开机出现CPU占用过高的情况 3....

  • 18253639006电脑总是CPU使用率100%怎么解决
    郗珊矿相信你的一定遇到过电脑动弹不得的时候,或许是只能眼看鼠标滑动而不能进行任何操作的时候,很多人都会经常遇到这样的问题:CPU占用率100%改如何解决,本文将从多个角度给你全方面的解析,希望阅读完本文希望在今后你遇到问题的时候能够带给你一些帮助。CPU经常性占用率100% 1、驱动没有经过认证,造成CPU资源占用100%。大...

  • 18253639006CPU资源经常占用100%,是什么原因呢?
    郗珊矿所有的流输入\/输出操作例如使用Windows Media Player听音乐将有可能是音乐失真成因: 当你在资源管理器里面右键点击一个文件或目录的时候,当快捷菜单显示的时候,CPU占用率将增加到100%,当你关闭快捷菜单的时候才返回正常水平。 解决方法: 方法一:关闭“为菜单和工具提示使用过渡效果” 1、点击“开始”--“控制面板”...

  • 18253639006cpu利用率怎么计算
    郗珊矿(2)在系统进入运行后,使用空闲任务执行与测试cpu处理能力基准完全相同的算法,得到rtcpuperformance.(3)周期地计算cpu占用率,并清除rtcpuperformance的值,一般每秒钟计算一次:realtime cpu load = 1 - (rtcpuperformance\/cpuperformancebase)100 评价:这个算法只适用于工控,电信等对不需要使cpu进入掉电保护...

  • 相关主题精彩

    版权声明:本网站为非赢利性站点,内容来自于网络投稿和网络,若有相关事宜,请联系管理员

    Copyright © 喜物网