今天开始看编程之美 。第一个问题是CPU的使用率控制,微软的问题果然高大上,我一看就傻了,啥也不知道。没追求直接看答案试了一下。发现自己电脑太好了,4核8线程,程序乱飘。加了一个进程绑定,可以控制一个CPU的占有率。

代码结果如下:

  1. #include"stdio.h"
  2. #include <Windows.h>
  3.  
  4. void main()
  5. {
  6. //前三行可以不要
  7. SYSTEM_INFO SystemInfo;
  8. GetSystemInfo(&SystemInfo);
  9. int CpuNum=SystemInfo.dwNumberOfProcessors; //获取cpu数目
  10. SetThreadAffinityMask(GetCurrentThread(), ); //线程与cpu绑定
  11. while()
  12. {
  13. for(int i=;i<;i++);
  14. Sleep();
  15. }
  16. }

现在的疑问是,不知道如何指定具体的某一个CPU. SetThreadAffinityMask的第二个参数改了后和自己想要的不一样。也不知道如何实现所有CPU占有率的同时控制。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

第二个版本 按照书中给的可以根据不同的CPU精确计算时间的代码  效果好很多

  1. //比初始最简单的版本好很多 CPU使用中可以得到非常漂亮的直线 不像之前有锯齿
  2. #include<stdio.h>
  3. #include<Windows.h>
  4.  
  5. void main()
  6. {
  7. const int busyTime=; //10ms
  8. const int idleTime=busyTime; //50% cpu useage
  9. int startTime=;
  10.  
  11. SetThreadAffinityMask(GetCurrentThread(), ); //cpu绑定
  12.  
  13. while()
  14. {
  15. int startTime=GetTickCount();
  16. //busy loop
  17. while(GetTickCount()-startTime<=busyTime);
  18.  
  19. //idle loop
  20. Sleep(idleTime);
  21. }
  22.  
  23. }

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

第三个版本 正弦曲线 可以调周期和赋值等参数

开始脑子晕了 总是搞不清楚关系 后来看了答案 发现答案的思路很清晰 自己又静下心来分析了一下正弦函数的表达式修改一下自己的代码 也实现了功能 不过曲线上个抖动比较大。

计算公式:

一次取样的时间 busytime+idletime=常数  单位毫秒

忙的时间占得百分比就是正弦函数计算的结果:

busytime/(busytime+idletime)=middle+amplitude*sin(x)

每一次的x值与周期有关

x=n*(busytime+idletime)/1000T      周期单位是秒   n每循环一次加1

代码:

  1. #include<stdio.h>
  2. #include<Windows.h>
  3. #include<math.h>
  4. #include<stdlib.h>
  5. #define Mine 1
  6. #define Answer 0
  7. #if Mine
  8. void main()
  9. {
  10. SetThreadAffinityMask(GetCurrentThread(), ); //cpu绑定
  11. double busyTime;
  12. double idleTime;
  13. double onceTime=; //一次抽样300ms busyTime+idleTime=300
  14. float up=0.8; //正弦曲线波峰值
  15. float down=0.2; //正弦曲线波谷值
  16. int T=; //正弦曲线周期s
  17. int startTime=;
  18. int n=;
  19.  
  20. float amplitude=(up-down)/; //振幅
  21. float middle=(up+down)/; //正弦曲线中心点
  22. while()
  23. {
  24.  
  25. busyTime=onceTime*(middle+amplitude*sin(*3.1415*n*onceTime/(*T)));
  26. idleTime=onceTime-busyTime;
  27.  
  28. int startTime=GetTickCount();
  29.  
  30. //busy loop
  31. while(GetTickCount()-startTime<=busyTime);
  32.  
  33. //idle loop
  34. Sleep(idleTime);
  35. n=n+;
  36. }
  37.  
  38. }
  39.  
  40. #endif
  41.  
  42. #if Answer
  43. const int SAMPLING_COUNT=; //抽样点数量
  44. const double PI=3.1415926535;
  45. const int TOTAL_AMPLITUDE=; //每个抽样点对应的时间片
  46.  
  47. int main()
  48. {
  49. SetThreadAffinityMask(GetCurrentThread(), );
  50. long busySpan[SAMPLING_COUNT];
  51. int amplitude=TOTAL_AMPLITUDE/;
  52. double radian=0.0;
  53. double radianIncrement=2.0/(double)SAMPLING_COUNT;
  54. for(int i=;i<SAMPLING_COUNT;i++)
  55. {
  56. busySpan[i]=(long)(amplitude+(sin(PI*radian)*amplitude));
  57. radian+=radianIncrement;
  58. }
  59. int startTime=;
  60. for(int j=;;j=(j+)%SAMPLING_COUNT)
  61. {
  62. startTime=GetTickCount();
  63. while((GetTickCount()-startTime)<=busySpan[j]);
  64. Sleep(+TOTAL_AMPLITUDE-busySpan[j]);
  65. }
  66. return ;
  67. }
  68.  
  69. #endif

书上代码结果:

自己写得代码结果:

抖动很大 而且onceTime变小后抖动更大了 在onceTime很小的时候 busytime/onceTime=0.5 时曲线都会饱和截至,不知道原因。

注:所有的图都是第一个cpu的结果有效。

【编程之美】CPU的更多相关文章

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

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

  2. 《编程之美》之如何控制CPU的暂用率固定在50%

    <编程之美>第一章 让CPU暂用率听你指挥的粗糙实现,如何控制CPU的暂用率固定在50% #include <stdio.h> #include <Windows.h&g ...

  3. java并发编程之美-阅读记录1

    1.1什么是线程? 在理解线程之前先要明白什么是进程,因为线程是进程中的一个实体.(线程是不会独立存在的) 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程中的 ...

  4. 【编程之美】2.5 寻找最大的k个数

    有若干个互不相等的无序的数,怎么选出其中最大的k个数. 我自己的方案:因为学过找第k大数的O(N)算法,所以第一反应就是找第K大的数.然后把所有大于等于第k大的数取出来. 写这个知道算法的代码都花了2 ...

  5. 编程之美的2.17,数组循环移位 & 字符串逆转(反转) Hello world Welcome => Welcome world Hello

    代码如下:(类似于编程之美的2.17,数组循环移位) static void Main(string[] args) { string input = "Hello World Welcom ...

  6. [质疑]编程之美求N!的二进制最低位1的位置的问题

    引子:编程之美给出了求N!的二进制最低位1的位置的二种思路,但是呢?但是呢?不信你仔细听我道来. 1.编程之美一书给出的解决思路 问题的目标是N!的二进制表示中最低位1的位置.给定一个整数N,求N!二 ...

  7. 编程之美 两个叶子的节点之间 最大距离 变种 leecode

    提交地址: https://oj.leetcode.com/problems/binary-tree-maximum-path-sum/ 说一下思路http://www.cnblogs.com/mil ...

  8. 编程之美之数独求解器的C++实现方法

    编程之美的第一章的第15节.讲的是构造数独.一開始拿到这个问题的确没有思路, 只是看了书中的介绍之后, 发现原来这个的求解思路和N皇后问题是一致的. 可是不知道为啥,反正一開始确实没有想到这个回溯法. ...

  9. 编程三基:cpu:算法,总线(io):一切皆文件;内存:运行空间

    编程三基:cpu:算法,总线:一切皆文件:内存:数据.运行空间 原文找不到了.

随机推荐

  1. sql事务和锁

    摘自:http://www.cnblogs.com/lxconan/archive/2011/10/20/sql_transaction_n_locks_1.html 最近在项目中进行压力测试遇到了数 ...

  2. php curl 库使用

    支持http basic认证: curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD ...

  3. C#高级知识点01---委托和事件

    委托和事件 什么是委托? 简单来说,就是能把方法当作参数传递的对象,而且还知道怎么去调用这个方法,同时还约束了方法的签名. 例子: 用委托实现插件式编程: 1.

  4. python 函数的文档字符串 docstrings

    函数体的第一行可以是一个可选的字符串文本:此字符串是该函数的文档字符串,或称为docstring.(更多关于 docstrings 的内容可以在 文档字符串一节中找到.)有工具使用 docstring ...

  5. 如何用极路由+OpenWrt+RTL电视棒搭建一台SDR服务器,并隐秘地捕获和传输数据

    0×00 前言 近期因为有个从异地捕获无线信号的需求,便尝试着用OpenWrt+公网IP搭建了一台SDR服务器.如果有小伙伴嫌SDR硬件天线看起来太乱.或者电脑没有足够的USB接口也可在局域网搭建SD ...

  6. RouterOS首次打开网页强制跳转

    网上极少有关于RouterOS的第一次打开网页强制跳转主页的方法,大多数都方法是将浏览某个域名的IP地址跳转到自己的主页,这种方法有时会失效.还有一种方法就是当用户用80端口连接时,抓取源地址到地址列 ...

  7. 2016年11月2日--Window.document对象

    一.找到元素: docunment.getElementById("id"):                      根据id找,最多找一个: var a =docunment ...

  8. 2-python学习——hello world

    "hello world"是编程界一个经久不衰的例子,几乎所有语言的学习教程都把它当做第一个程序的范例.学习的过程就是再造轮子的过程,千万不要以为有人做过的,就不去学习了. hel ...

  9. 校赛E题递归形式

    #include<stdio.h> #include<string.h> using namespace std; typedef long long ll; ][]; ,,, ...

  10. Weiphp随笔,百度天气API接口

    新建插件名必须大写 http://api.map.baidu.com/telematics/v3/weather?location=%E5%8C%97%E4%BA%AC&output=json ...