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


  • 相关阅读:
    Saltstack module gem 详解
    Saltstack module freezer 详解
    Saltstack module firewalld 详解
    Saltstack module file 详解
    Saltstack module event 详解
    Saltstack module etcd 详解
    Saltstack module environ 详解
    Saltstack module drbd 详解
    Saltstack module dnsutil 详解
    获取主页_剥离百度
  • 原文地址:https://www.cnblogs.com/NewWork/p/3260585.html
Copyright © 2011-2022 走看看