• 最简便降低cpu使用率 > 1.1 让 CPU 占用率曲线听你指挥
  • 1.1 让 CPU 占用率曲线听你指挥

    免费下载 下载该文档 文档格式:PDF   更新时间:2008-03-01   下载次数:0   点击次数:1
    文档基本属性
    文档语言:
    文档格式:pdf
    文档作者:lsj
    关键词:
    主题:
    备注:
    点击这里显示更多文档属性
    1.1 让 CPU 占用率曲线听你指挥
    1
    《编程之美——微软技术面试心得》
    《编程之美——微软技术面试心得》(http://www.china-pub.com/38070)是微软亚洲研究院
    技术创新组研发主管邹欣继《移山之道——VSTS 软件开发指南》后的最新力作.它传达
    给读者:微软重视什么样的能力,需要什么样的人才.但它更深层的意义在于引导读者思考,提倡一种发 现问题,解决问题的思维方式,充分挖掘编程的乐趣,展示编程之美.本书 3 月份上市.网上讨论和解答 在:www.msra.cn/bop
    题目《让 CPU 占用率曲线听你指挥》
    问题
    写一个程序,让用户来决定 Windows 任务管理器(Task Manager)的 CPU 占用率.程 序越精简越好,计算机语言不限.例如,可以实现下面三种情况:
    1. CPU的占用率固定在50%,为一条直线; 2. CPU的占用率为一条直线,但是具体占用率由命令行参数决定(参数范围1~ 100) ;
    编程之美——微软技术面试心得
    2
    1.1 让 CPU 占用率曲线听你指挥
    3. CPU的占用率状态是一个正弦曲线.
    分析与解法
    1
    有一名学生写了如下的代码:
    while (true) { if (busy) i++; else }
    然后她就陷入了苦苦思索: 干什么呢 怎么才能让电脑不做事情呢 CPU 使用率为 else 0 的时候,到底是什么东西在用 CPU 另一名学生花了很多时间构想如何"深入内核,以控 制 CPU 占用率"——可是事情真的有这么复杂么 MSRA TTG(Microsoft Research Asia, Technology Transfer Group)的一些实习生写了各 种解法,他们写的简单程序可以达到如图 1-1 所示的效果.
    图 1-1
    编码控制 CPU 占用率呈现正弦曲线形态
    看来这并不是不可能完成的任务. 让我们仔细地回想一下写程序时曾经碰到的问题, 如
    1
    作者注:当面试的同学听到这个问题的时候,很多人都有点意外.我把我的笔记本电脑交给他们说,这是开 卷考试,你可以上网查资料,干什么都可以.大部分面试者在电脑上的第一个动作就是上网搜索"CPU 控 制 50%"这样的关键字,当然没有找到什么直接的结果.不过这本书出版以后,情况可能就不一样了.
    编程之美——微软技术面试心得
    1.1 让 CPU 占用率曲线听你指挥
    3
    果我们不小心写了一个死循环,CPU 占用率就会跳到最高,并且一直保持 100%.我们也可 以打开任务管理器 ,实际观测一下它是怎样变动的.凭肉眼观察,它大约是 1 秒钟更新一
    2
    次.一般情况下,CPU 使用率会很低.但是,当用户运行一个程序,执行一些复杂操作的 时候,CPU 的使用率会急剧升高.当用户晃动鼠标时,CPU 的使用率也有小幅度的变化. 那当任务管理器报告 CPU 使用率为 0 的时候, 谁在使用 CPU 呢 通过任务管理器的"进 程(Process) "一栏可以看到,System Idle Process 占用了 CPU 空闲的时间——这时候大家该 回忆起在"操作系统原理"这门课上学到的一些知识了吧.系统中有那么多进程,它们什么时 候能"闲下来"呢 答案很简单,这些程序或者在等待用户的输入,或者在等待某些事件的发 ,或者进入休眠状态(通过 Sleep()来实现) . 生(WaitForSingleObject()) 在任务管理器的一个刷新周期内,CPU 忙(执行应用程序)的时间和刷新周期总时间的 比率,就是 CPU 的占用率,也就是说,任务管理器中显示的是每个刷新周期内 CPU 占用率 的统计平均值.因此,我们写一个程序,让它在任务管理器的刷新期间内一会儿忙,一会儿 闲,然后通过调节忙/闲的比例,就可以控制任务管理器中显示的 CPU 占用率. 【解法一】简单的解法 步骤 1 要操纵 CPU 的 usage 曲线,就需要使 CPU 在一段时间内(根据 Task Manager 的采样率)跑 busy 和 idle 两个不同的 loop,从而通过不同的时间 比例,来获得调节 CPU Usage 的效果. 步骤 2 Busy loop 可以通过执行空循环来实现,idle 可以通过 Sleep()来实现.
    问题的关键在于如何控制两个 loop 的时间,方法有二: Sleep一段时间,然后以for循环n次,估算n的值. 那么对于一个空循环 for(i = 0; i 50%) , 然后跌到一个很低的占用率. 我们尝试着降低两个数量级,令 n = 9 600 000,而睡眠时间相应改为 10 毫秒 (Sleep(10)) .用 10 毫秒是因为它不大也不小,比较接近 Windows 的调度时间片.如果选 得太小(比如 1 毫秒) ,则会造成线程频繁地被唤醒和挂起,无形中又增加了内核时间的不 确定性影响.最后我们可以得到如下代码: 代码清单 1-1

    下一页

  • 下载地址 (推荐使用迅雷下载地址,速度快,支持断点续传)
  • 免费下载 PDF格式下载
  • 您可能感兴趣的
  • 如何降低cpu使用率  降低cpu使用率的软件  怎么降低cpu使用率  降低cpu使用率  cpu使用率高如何降低  如何使cpu使用率降低  怎样让cpu使用率降低  降低cpu使用率apk  怎样降低cpu使用率