• 让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


  • 相关阅读:
    数组是个好东西
    排列(permutation) 用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要 求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。
    子序列的和
    韩信点兵
    水仙花数
    阶乘之和
    3n+1问题
    MongoDB 安装
    mysql中bigint在php中表示
    Android之NDK开发
  • 原文地址:https://www.cnblogs.com/NewWork/p/3260585.html
Copyright © 2020-2023  润新知