zoukankan      html  css  js  c++  java
  • 让CPU占用率听你指挥

    这道题目只从《编程之美》这本书出了之后,研究它的人不在少数,最近自己也是在快要毕业的阶段,所以拜读了这本书,并在网上看了很多其他的对此题的各种看法。

    下面我主要是作为一种练习题一样,写了差不多的代码,并验证了各种解法。(下面是代码和贴图)

    解法一:简单解法 

    Busy用可循环来实现,for(i=0;i<n;i++) ;

    对应的汇编语言为

    loop;

    mov dx i     ;将i置入dx寄存器

    inc dx          ;将dx寄存器加1

    mov dx i       ;将dx中的值赋回i

    cmp i n         ;比较i和n

    j1 loop          ;i小于n时则重复循环

    我的cpu(双核)1.87GHZ 现代cpu每个时钟周期可执行两条以上的代码,取平均值2,于是

    (1870 000 000*2)/5=744000000(循环/秒) 每秒可以执行循环744000000次

    不能简单的取n=7440000000然后sleep(1000),如果让cpu工作1s,休息1s很可能是锯齿,先达到一个峰值然后跌入一个很低的占有率;所以我们睡眠时间改为10ms,10ms比较接近windows的调度时间,n=7440000。如果sleep时间选的太小,会造成线程频繁的唤醒和挂起,无形中增加了内核时间的不确定性因此代码如下:

    #include "stdafx.h"
    
    #include<windows.h>
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	//50%..
    	//Thread 0 can only run on CPU 0.  
    	SetThreadAffinityMask(GetCurrentProcess(),0x00000001);
    	while(true){
    		for(int i=0;i<744000000;i++);
    		Sleep(10);
    	}
    	return 0;
    }
    

    很显然,是个比较锯齿的样子。


    后面还有很多比较难的解法,涉及的东西比较多,有机会再续。。。


    还是把一篇好的文章附在下面,不多说了,个人觉得很是精彩http://blog.csdn.net/wesweeky/article/details/6402564


  • 相关阅读:
    linux 网络不通问题排查
    linux下挂载U盘
    git 详细教程网址
    字符串的全排列和组合算法
    D-BUS详细分析
    linux socket编程之TCP与UDP
    Linux下的 .o、.a、.so文件
    Fiddler HTTPS指南
    nm指令
    无法使用xcode打出ipa包的解决方法
  • 原文地址:https://www.cnblogs.com/NewWork/p/3260585.html
Copyright © 2011-2022 走看看