全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
教你玩转教你玩转 CPU 随心所欲控制随心所欲控制 CPU 占用率曲线走向占用率曲线走向 我想大家都知道电脑的任务管理器里面有个 CPU 占用率曲线吧 他根据系统使用资源 的不同实时显示 那能不能使这个曲线按照自己的思想显示呢 如使他一直保持一个固定 的值 如 50 或者正弦曲线 听起来好像很难 但如果是让你用 C C 或 java 等语言写 一个最简短的程序 你会不会觉得更难呢 不错 这曾经是微软亚洲研究院 Microsoft Research Asia MSRA 的一道面试题 据说这道题就淘汰了当批接受面试的 85 的人 他 的原题如下 1 CPU 的占用率固定为 50 为一条直线 2 CPU 的占用率为一条直线 但是具体占用率由命令行参数决定 参数范围 1 100 3 CPU 的占用率状态是一个正弦曲线 看来这并不是不可能完成的任务 然我们仔细回想一下写程序时曾经碰到的问题 如 果我们不小心写了一个死循环 CPU 占用率就会跳到最高 并且一直保持 100 我们也可 以打开任务管理器 实际观测一下它是怎样变动的 凭肉眼观察 它大约是每一秒钟更新 一次 一般情况下 CPU 的占用率很低 但是当用户运行一个程序时 执行一些复杂的操 作时 CPU 的使用率会急剧增加 当用户鼠标晃动时 CPU 的使用率也会有小幅度的变化 那么当任务管理器报告 CPU 的使用率为 0 的时候 谁在使用 CPU 呢 通过任务管理器 的 进程 Process 一栏可以看到 System Idle Process 占用了 CPU 空闲的时间 这时候大家该回忆起在 操作系统原理 这门课上学到的一些知识了吧 系统中有那么多 的进程 他们什么时候能 闲下来 呢 答案很简单 这些程序在等待用户的输入 或者 在等待某些事件的发生 或者主动进入休眠状态 在任务管理器的一个刷新周期内 CPU 忙 执行应用程序 的时间和刷新周期总时间 的比率 就是 CPU 的占用率 也就是说 任务管理器显示的是每个刷新周期内 CPU 占用率 的统计平均值 因此 我们写了一个程序 让他在任务管理器的刷新期内一会儿忙 一会 儿闲 然后通过调节忙 闲比例 就可以控制任务管理器中显示的 CPU 占用率 要操纵 CPU 的使用率曲线 就需要使 CPU 在一段时间内 更具 Task Manager 的采样率 跑 busy 和 idle 两个不同的循环 loop 从而通过不同的时间比例 来调节 CPU 使用率 busy loop 可以通过执行空循环来实现 idle 可以通过 Sleep 实现 问题的关键在于如何控制两个 loop 时间 我们先实验一下 Sleep 一段时间 然后循环 n 次 估算 n 的值 那么对于一个空循环 for i 0 i50 然后跌倒一个很低的占用率 我们尝试降低两个数量级 令 n 960 0000 而睡眠时间相应改为 10 毫秒 Sleep 10 用 10 毫秒是因为它不大也不小 比较接近 Windows 的调度时间片 如果选得太小 比如 1 毫 秒 则会造成线程频繁的被唤醒和挂起 无形中友增加了内核时间的不确定性影响 最 后我们得到如下代码 int main for for int i 0 i 9600000 i Sleep 10 return 0 在 VC 中用 Sleep 前面要加上 include windows h 在不断调整 9600000 的参 数后 我们就可以在一台指定的机器上获得一条大致稳定 50 CPU 占用率曲线 使用这种方法要注意两点影响 1 尽量减少 sleep awake 的频率 减少操作系统内核调度程序的干扰 2 尽量不要调用 system call 比如 I O 这些 privilege instruction 因为 它也会导致很多不可控的内核运行时间 3 上面的程序是针对单核 CPU 的 如果是多核 CPU 那么 CPU 占用率曲线有好几个 如 果自定义指定哪个或哪几个显示呢 可以在 for 前面加上 SetProcessAffinityMask 函数 BOOL SetProcessAffinityMask HANDLE hProcess DWORD PTR dwProcessAffinityMask 第一个参数用来指定指定哪个进程 传入它的句柄 第二个进程用来指定哪个 CPU 核心来 执行此进程 DWORD PTR 其实就是 unsigned long Unsigned long type for pointer precision Use when casting a pointer to a long type to perform pointer arithmetic Also commonly used for general 32 bit parameters that have been extended to 64 bits in 64 bit windows DWORD 其实就是 unsigned long Windows 下常用来保存地址或存放指针 比如这样调用函数 SetProcessAffinityMask GetCurrentProcess 0 x1 可以指定当前执行 的进程在第一个 CPU 上运行 00000001 对于双核 CPU SetProcessAffinityMask GetCurrentProcess 0 x2 可以指定在第二个 CPU 上运行 00000010 SetProcessAffinityMask GetCurrentProcess 0 x3 可以允许在两个 CPU 上任意运行 000000011 SetProcessAffinityMask GetCurrentProcess 0 x3 可以允许在第三个 CPU 上任意运行 000000100 SetProcessAffinityMask GetCurrentProcess 0 x3 可以允许在第一个 和第三个 CPU 上任意运行 00000101 以此类推 该方法的缺点很明显 不能适应机器的差异性 一旦换了一个 CPU 我们又得重新估 算 n 值 有没有方法动态的了解 CPU 的运算能力 然后自动调节忙 闲的时间比呢 当然可以 我们知道 GetTickCount 可以得到 系统启动到现在 所经历的时间的毫秒 值 我们可以利用 GetTickCount 来判断 busy 要循环多久 核心代码如下 int busyTime 10 10 ms int idleTime busyTime same ratio will lead to 50 cpu usage Int64 startTime 0 while true startTime GetTickCount busy loop while GetTickCount startTime level System Threading Thread Sleep 10 有了前面的积累 我们应该可以让任务管理器画出优美的正弦曲线了 见下面的代码 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 const int INTERVAL 300 int tmain int argc TCHAR argv DWORD busySpan COUNT array of busy times DWORD idleSpan COUNT array of idle times int half INTERVAL 2 double radian 0 0 for int i 0 i COUNT i busySpan i DWORD half sin PI radian half idleS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中小学班主任家校协同教育计划制定能力考核试卷
- 2025年广告行业数字广告与消费者反馈研究报告及未来发展趋势预测
- 2025年互联网医疗行业医疗健康大数据应用报告
- 2025年互联网行业区块链应用水平考试-AI生成数字资产NFT确权考核试卷
- 2025年建筑电工职业技能竞赛光伏电站电气系统操作考核试卷
- 2026中国铁路沈阳局集团有限公司招聘高校毕业生475人(一)考试笔试参考题库附答案解析
- 2025合肥市粮食集团有限公司公开招聘工作人员7人笔试考试参考题库及答案解析
- 2026重庆市设计院有限公司校园招聘4人考试笔试备考试题及答案解析
- 2025年下半年长春市总工会公开招聘工会社会工作者(61人)笔试考试备考题库及答案解析
- 2025浙江金华市东阳市部分机关事业单位招聘编外人74人员(二)考试笔试模拟试题及答案解析
- 2026届新高考物理热点冲刺复习 从“心”出发向“新”而行-三新背景下物理高考的守正与创新
- 风险评估标准作业流程表合规风险管理版
- 全国大学生职业规划大赛《卫星通信与导航技术》专业生涯发展展示【高职(专科)】
- 2025外研版新教材英语七年级上册单词表(复习必背)
- 凭什么让学生服你:读书分享技巧
- 四级手术术前多学科讨论制度(2025年)
- 血友病预防知识培训课件
- 沙石料销售知识培训内容课件
- 人教版六年级数学上册第一单元测试卷(含解析)
- 2025云南昆明元朔建设发展有限公司第一批收费员招聘20人备考考试题库附答案解析
- 2025年微生物专升本习题库(含答案)
评论
0/150
提交评论