在《编程之美》上看过一道面试题就是要求:输出cup占用率的曲线图

今天看到了一篇文章就试试看看:

  1. #include <iostream>
  2. #include <cmath>
  3. #include <ctime>
  4. #include <windows.h>
  5.  
  6. using namespace std;
  7.  
  8. //得到循环0xFFFFFFFF次用的秒数
  9. unsigned int test()
  10. {
  11. unsigned int c = 0xFFFFFFFF;
  12.  
  13. time_t t1, t2;
  14. time(&t1);
  15.  
  16. for (unsigned int i = ; i < c; i++)
  17. ;
  18. time(&t2);
  19. return (unsigned int)(t2 - t1);
  20.  
  21. }
  22.  
  23. #define T 20000 //周期时间 20秒
  24. #define C 100 //采样点时间间隔
  25. #define PI 3.1415 //PI
  26.  
  27. const unsigned int _count = 0xFFFFFFFF / (test() * ); //采样间隔可以执行的循环数目 //考虑到了当前系统的运行程序
  28. const unsigned int N = T / C; //周期内采样点数目
  29. unsigned int v[N] = { }; //所有采样点连续执行循环数
  30. unsigned int mt[N] = { }; //所有采样点休眠毫秒数
  31.  
  32. int main()
  33. {
  34. //指定运行CPU
  35. SetThreadAffinityMask(GetCurrentThread(), );
  36.  
  37. for (int i = ; i < N; i++)
  38. {
  39. double x = * PI * i / N;
  40. double r = (sin(x) + ) / ;
  41.  
  42. mt[i] = C - r * C; //空闲时间
  43. v[i] = r * C * _count; //忙的时间,考虑当前cup使用情况
  44. }
  45. for (;;)
  46. {
  47. for (int i = ; i < N; i++)
  48. {
  49. for (int j = ; j < v[i]; j++)
  50. ;
  51. Sleep(mt[i]);
  52. }
  53. }
  54. }

实验结果:指定运行cup和核数有关吧

首先什么是CPU占用率?

在任务管理器的一个刷新周期内,CPU忙(执行应用程序)的时间和刷新周期总时间的比率,就是CPU的占用率,也就是说,任务管理器中显示的是每个刷新周期内CPU占用率的统计平均值。

因此可以写个程序,在一个刷新周期中,一会儿忙,一会儿闲,调节忙/闲比例,就可以控制CPU占有率!

题目:写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率。程序越精简越好,计算机语言不限。例如,可以实现下面三种情况:

1.    CPU的占用率固定在50%,为一条直线;

2.    CPU的占用率为一条直线,但是具体占用率由命令行参数决定(参数范围1~ 100);

3.    CPU的占用率状态是一个正弦曲线。

直线cpu:使x=0即可:

  1. #include <iostream>
  2. #include <cmath>
  3. #include <ctime>
  4. #include <windows.h>
  5.  
  6. using namespace std;
  7.  
  8. //得到循环0xFFFFFFFF次用的秒数
  9. unsigned int test()
  10. {
  11. unsigned int c = 0xFFFFFFFF;
  12.  
  13. time_t t1, t2;
  14. time(&t1);
  15.  
  16. for (unsigned int i = ; i < c; i++)
  17. ;
  18. time(&t2);
  19. return (unsigned int)(t2 - t1);
  20.  
  21. }
  22.  
  23. #define T 20000 //周期时间 20秒
  24. #define C 100 //采样点时间间隔
  25. #define PI 3.1415 //PI
  26.  
  27. const unsigned int _count = 0xFFFFFFFF / (test() * ); //采样间隔可以执行的循环数目
  28. const unsigned int N = T / C; //周期内采样点数目
  29. unsigned int v[N] = { }; //所有采样点连续执行循环数
  30. unsigned int mt[N] = { }; //所有采样点休眠毫秒数
  31.  
  32. int main()
  33. {
  34. //指定运行CPU
  35. SetThreadAffinityMask(GetCurrentThread(), );
  36.  
  37. ////正弦cpu
  38. //for (int i = 0; i < N; i++)
  39. //{
  40. // double x = 2 * PI * i / N;
  41. // double r = (sin(x) + 1) / 2;
  42.  
  43. // mt[i] = C - r * C;
  44. // v[i] = r * C * _count;
  45. //}
  46. //for (;;)
  47. //{
  48. // for (int i = 0; i < N; i++)
  49. // {
  50. // for (int j = 0; j < v[i]; j++)
  51. // ;
  52. // Sleep(mt[i]);
  53. // }
  54. //}
  55.  
  56. //直线cpu
  57. for (int i = ; i < N; i++)
  58. {
  59. double x = * PI * i / N;
  60. x = ;
  61. double r = (sin(x) + ) / ;
  62.  
  63. mt[i] = C - r * C;
  64. v[i] = r * C * _count;
  65. }
  66. for (;;)
  67. {
  68. for (int i = ; i < N; i++)
  69. {
  70. for (int j = ; j < v[i]; j++)
  71. ;
  72. Sleep(mt[i]);
  73. }
  74. }
  75. }
  76.  
  77. //没有考虑现在系统cpu使用情况
  78. //#include <windows.h>
  79. //#include <math.h>
  80. //int main(void)
  81. //{
  82. // SetThreadAffinityMask(GetCurrentProcess(), 1);
  83. // const double SPLIT = 0.01;
  84. // const int COUNT = 200;
  85. // const double PI = 3.14159265;
  86. // const int INTERVAL = 300;
  87. // DWORD busySpan[COUNT]; //array of busy time
  88. // DWORD idleSpan[COUNT]; //array of idle time
  89. // int half = INTERVAL / 2;
  90. // double radian = 0.0;
  91. // for (int i = 0; i < COUNT; i++)
  92. // {
  93. // busySpan[i] = (DWORD)(half + (sin(PI*radian)*half));
  94. // idleSpan[i] = INTERVAL - busySpan[i];
  95. // radian += SPLIT;
  96. // }
  97. // DWORD startTime = 0;
  98. // int j = 0;
  99. // while (true)
  100. // {
  101. // j = j%COUNT;
  102. // startTime = GetTickCount();
  103. // while ((GetTickCount() - startTime) <= busySpan[j])
  104. // ;
  105. // Sleep(idleSpan[j]);
  106. // j++;
  107. // }
  108. // return 0;
  109. //}

结果:

reference:

CPU正弦曲线

控制CUP占用率曲线的更多相关文章

  1. 控制CPU占用率曲线

    编程之美的第一个问题,我的机器是双核的,用文中的代码,得到的曲线波动比较大额,受其他进程的影响比较大.文中提到10ms接近windows的调度时间片,如果选得太小,会造成线程被频繁唤醒和挂起,造成内核 ...

  2. 编程之美读书笔记1.1——让CPU占用率曲线听你的指挥

    http://blog.csdn.net/pipisorry/article/details/36189155 <strong><span style="font-size ...

  3. 编程之美_1.1 让CPU占用率曲线听你指挥

    听到有人说让要写一个程序,让用户来决定Windows任务管理器的CPU占用率. 觉得很好奇.但第一个想法就是写个死循环.哈哈.不知道具体的占用率是多少,但至少能保证在程序运行时,CPU的占用率终会稳定 ...

  4. 让cpu占用率曲线听你指挥(多核处理器)

    编程之美 1.1 让cpu占用率曲线听你指挥(多核处理器) [版权声明]转载请注明出处 http://www.cnblogs.com/TenosDoIt/p/3242910.html  [目录] 不考 ...

  5. 第1章 游戏之乐——让CPU占用率曲线听你指挥

    让CPU占用率曲线听你指挥 写一个程序,让用于来决定Windows任务管理器(Task Manager)的CPU占用率.程序越精简越好,计算机语言不限.例如,可以实现下面三种情况: CPU的占用率固定 ...

  6. JVM CUP占用率过高排除方法,windows环境

    jdk自带的jvisualvm可以看到程序CPU使用率,但是无法确定具体的线程,想要确定到具体的线程需要借用到微软的Process Explorer 具体排除方法: 一:打开资源管理器,找到cup占用 ...

  7. 1.1 让CPU占用率曲线听你指挥[cpu manager]

    [本文链接] http://www.cnblogs.com/hellogiser/p/cpu-manager.html [题目] 写一个程序,让用户来决定Windows任务管理器(Task Manag ...

  8. 编程之美 1.1 让cpu占用率曲线听你指挥(多核处理器)

    [目录] 不考虑其他进程,cpu画正弦曲线 获取总体cpu利用率 获取多核处理器单个cpu利用率 考虑其他进程,cpu画正弦曲线 下面的程序针对多核处理器,可以设置让任何一个cpu显示相应的曲线(本文 ...

  9. 让CPU占用率曲线听你指挥

    使用GetTickCount()和Sleep(): Code#include <stdio.h> #include <unistd.h> #include <time.h ...

随机推荐

  1. docker容器utf-8编码问题

    locale -a export LANG=C.UTF-8 locale 在docker容器中python脚本汉字的会乱码 按照上面的方法暂时的设置下容器 编码可以解决脚本中文乱码问题

  2. luogu3389 【模板】高斯消元法

    #include <algorithm> #include <iostream> #include <cstdio> #include <cmath> ...

  3. java append方法

    JAVA 中 Stringbuffer 有append()方法  Stringbuffer其实是动态字符串数组  append()是往动态字符串数组添加,跟“xxxx”+“yyyy”相当那个‘+’号  ...

  4. 浅析win32 Win64 x86 x64 区别 及Eclipse启动报Java was started but returned exit code=13 错误

    win32.x86_64是64位 X86就是  32位系统 X64 就是64位系统 最好记得方法就是带有64的就是64位,其余都是32位 为什么要讲这个呢? 如果是绿色版本的eclipse,在打开ec ...

  5. 网络流(自行理解的Dinic)

    自行理解的Dinic 注释即讲解 #include<bits/stdc++.h> ; using namespace std; int read() { ,w=; ;ch=getchar( ...

  6. 解决 Could not load hsdis-amd64.dll

    win10下想查看JIT编译的汇编源码 结果提示: Could not load hsdis-amd64.dll; library not loadable; PrintAssembly is dis ...

  7. 【前端学习笔记】2015-09-06 ~~~~ setAttribute()、slice()

    所遇记录: 1.setAttribute("属性",value),相同的还有addAttribute("属性名",value),getAttribute(“属性 ...

  8. bzoj 4184 shallot 时间线建线段树+vector+线性基

    题目大意 n个时间点 每个时间点可以插入一个权值或删除一个权值 求每个时间点结束后异或最大值 分析 异或最大值用线性基 但是线性基并不支持删除操作 我们可以对时间线建一棵线段树 离线搞出每个权值出现的 ...

  9. poj 4001 To Miss Our Children Time

    To Miss Our Children Time Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Jav ...

  10. JavaWeb学习总结(十七)——JSP中的九个内置对象(转)

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...