让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


posted @ 2013-03-19 20:28  旧事乡里人  阅读(155)  评论(0编辑  收藏  举报