学习自《程序员》2008年03月刊
问题:
写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率。程序越精简越好,计算机语言不限。例如,可以实现下面三种情况:
1. CPU的占用率固定在50%,为一条直线;
2. CPU的占用率为一条直线,但是具体占用率由命令行参数决定(参数范围1-100);
3. CPU的占用率状态是一个正弦曲线。
分析与解法:
凭肉眼观察,任务管理器大约1S钟更新一次。当CPU使用率为0的时候,通过“进程”选项卡可以看到,System Idle Process占用了CPU空闲的时间。回忆一下,系统中有那么多进程,它们什么时候能闲下来?要么等待用户输入,要么等待某事件发生(WaitForSingleObject()),或进入休眠状态(通过sleep()实现)。
在任务管理器的一个刷新周期内,CPU忙的时间/刷新周期总时间=CPU占用率。也就是说,任务管理器中显示的是每个刷新周期内CPU占用率的统计平均值。因此,我们写程序让它在任务管理器的刷新周期内一会儿忙,一会儿闲,通过调节忙/闲比例,控制CPU占用率。
解法一:简单的解法
代码清单1-1
int main()
{
for( ; ;)
{
for(int i=0; i<9600000; i++)
sleep(10);
}
return 0;
}
|
为什么会选取9600000和10两个参数呢?请听细解:
CPU执行的都是机器指令,而最接近于机器指令的是汇编语言,所以我们可以先把for(int i=0;i<n;i++)写成如下汇编代码再进行分析
loop:
mov dx i ;将i置入dx寄存器
inc dx ;将dx寄存器加1
mov i dx ;将dx中的值赋回i
cmp i n ;比较i和n
jl loop ;i小于n时则重复循环
|
假设这段代码要执行的CPU是P4 2.4Ghz(即2.4*10^9个时钟周期每秒)。现代CPU每个时钟周期可以执行两条以上的代码(这里按两条算),那么(2.4*10^9)*2/5=960 000 000(循环/秒)。而如果我们直接令n=960 000 000,然后再sleep(1000),即忙1S闲1S,那么波形很可能就是锯齿状的—先达到一个峰值,然后跌到一个很低。于是我们尝试降低两个数量级,即n=n/100;sleep(10).用10ms是因为它比较接近Windows的调度时间片,如果选得太小,则会造成线程频繁地被唤醒和挂起,无形中增加了内核时间的不确定性影响。
使用这种方法要注意两点:1. 尽量减少sleep/awake的频率,如果频繁发生,影响则会很大,因为此时更高的操作系统内核调度程序会占用很多CPU运算时间;2. 尽量不要调用system call(比如IO这些privilege instruction),因为它也会导致很多不可控的内核运行时间。
这种方法缺点也很明显:1. 不能适应机器差异性,换了CPU就要重新计算N值;2. 没办法动态了解CPU运算能力,然后自动调节忙/闲比。
解法二:使用GetTickCount()和Sleep()
代码清单1-2
int busyTime=10; //10ms
int idleTime=busyTime;
int64 startTime=0;
while(true)
{
startTime=GetTickCount();
while( GetTickCount()-starTime <=busyTime ) ;
sleep(idleTime);
}
|
我们知道,GetTickCount()可以得到“系统启动到现在”的毫秒值,最多能够统计到49.7天。另外,利用sleep()最多也只能精确到1ms.因此,可以在“ms”这个数量级上操作和比较。
以上两种解法都是假设目前系统 上只有当前程序在运行,但实际上,操作系统中有很多程序都会在不同时间执行各种任务。那怎么做呢?我们得知道“当前CPU占用率是多少”,这就要用到另一个工具来帮忙—Perfmon.exe。
我们可以写程序来查询Perfmon的值,Microsoft .NET Framework提供了PerformanceCounter()这一类型,从而可方便地拿到当前各种计算机性能数据,包括CPU使用率。
解法三:正弦曲线
//C++ code to make task manager
//generate sine graph
#include "Windows.h"
#include "stdlib.h"
#include "math.h"
const double SPLIT=0.01;
const int COUNT=200;
const double PI=3.14159265;
coust int INTERVAL=300;
int _tmain(int argc, _TCHAR* argv[])
{
//array of busy times
DWORD busySpan[COUNT];
//array of idle times
DWORD idleSpan[COUNT];
int half=INTERVAL/2;
double radian=0.0;
for(int i=0;i<COUNT;i++)
{
busySpan[i]=(DWORD)(half+sin(PI*radian)*half);
idleSpan[i]=INTERVAL-busySpan[i];
radian+=SPLIT:
}
DWORD startTime=0;
int j=0;
while(true)
{
j=j%COUNT;
startTime=GetTickCount();
while(GetTickCount()-startTime<=busySpan[j]);
Sleep(idleSpan[j]);
j++;
}
return 0;
}
|
分享到:
相关推荐
内容概要:本文提供了详细的MongoDB分片集群的搭建指导,涵盖了从环境准备、配置文件编写、副本集的建立、主节点的选择、配置服务器和数据分片服务器的配置到最后的路由节点的搭建与操作整个流程,以及对数据库的哈希与范围两种分片策略的应用介绍和具体命令执行。 适合人群:熟悉NoSQL数据库概念并对MongoDB有一定了解的技术人员,尤其是在大型数据管理和分布式数据库架构设计中有需求的开发者。 使用场景及目标:帮助技术人员掌握构建高效能、高可用性的MongoDB分片集群的方法,适用于处理大规模、实时性强的数据存储与读取场景。 其他说明:文中通过实例演示了每个步骤的具体操作方法,便于跟随文档实操,同时也介绍了可能遇到的问题及其解决方案,如在没有正确配置的情况下试图写入数据时出现错误等情况的处理。
CPPC++_嵌入式硬件的物联网解决方案blinker库与Arduino ESP8266 ESP32一起工作
CPPC++_逆向调用QQ Mojo IPC与WeChat XPlugin
CPPC++_现代活动指标
CPPC++_Xournal是一款手写笔记软件,支持PDF注释,使用C语言编写,支持GTK3,支持Linux,如Ubu
资源概述: 本资源提供了一套完整的学生实习管理系统解决方案,涵盖了前台小程序页面与后台管理系统两大模块。前台小程序页面设计简洁直观,用户可根据不同身份(学生或企业)进行登录。学生用户能够方便地浏览并投递感兴趣的实习岗位,而企业用户则能轻松发布实习信息,吸引优秀人才。后台管理系统功能全面,包括个人中心、首页、学生管理、教师管理、企业管理、招聘管理、评分管理以及实习管理等多个方面,为管理员提供了强大的数据管理和操作工具。 技术栈亮点: SSM框架:系统后台采用Spring、Spring MVC和MyBatis Plus(简称SSM)作为核心开发框架,确保了系统的稳定性、可扩展性和可维护性。Spring作为控制反转(IoC)和面向切面编程(AOP)的容器,为系统提供了强大的业务逻辑处理能力;Spring MVC则负责处理Web请求和响应,实现了前后端的分离;MyBatis Plus作为持久层框架,简化了数据库操作,提高了开发效率。 MySQL数据库:系统采用MySQL作为数据库存储解决方案,支持大数据量的存储和高效查询。 如有侵权请联系我删除,谢谢
微服务闪聚支付项目
博客链接 https://blog.csdn.net/weixin_47560078/article/details/143714557 文章从原理介绍出发,实现了 Rust 与 Java 的互调。利用 JNI 技术,可以充分发挥 Rust 的性能优势,同时保持 Java 的跨平台特性。这种技术组合适用于对性能要求较高的应用场景,如图像处理、数据分析和系统级编程等。
cppc++
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
分布式事务lcn
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
cppc++
安卓手机与电脑的socket通信源码
Anaconda:JupyterNotebook使用教程.docx
Amazon S3:S3静态网站托管教程.docx
Python商品销售数据分析可视化项目源码(期末大作业).zip,个人经导师指导并认可通过的98分大作业设计项目。主要针对计算机相关专业的正在做期末大作业设计的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业,代码资料完整下载可用。 Python商品销售数据分析可视化项目源码(期末大作业).zip,个人经导师指导并认可通过的98分大作业设计项目。主要针对计算机相关专业的正在做期末大作业设计的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业,代码资料完整下载可用。Python商品销售数据分析可视化项目源码(期末大作业).zip,个人经导师指导并认可通过的98分大作业设计项目。主要针对计算机相关专业的正在做期末大作业设计的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业,代码资料完整下载可用。Python商品销售数据分析可视化项目源码(期末大作业).zip,个人经导师指导并认可通过的98分大作业设计项目。主要针对计算机相关专业的正在做期末大作业设计的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业,代码资料完整下载可用。Python商品销售数据分析
CPPC++_wechathookWeChatApi微信Api微信hook微信接口python微信接口java微信Ap