我的电脑配置: mac 3.1GHz
目标是做到控制cpu占用率在50%
首先对占用率可以每秒统计一次平均值,也可以每2秒统计一次,这里就先按2秒计算一次cpu占用率,使得占用率维持在50%。
用到的代码是for循环和sleep,空的for循环时候cpu占用率可以到100%,sleep是0%,只要控制这两段代码各自执行1s(我们2s统计一次cpu占用率,那么统计结果就是50%),所以问题就是怎么样控制空的for循环执行1s。
主频=1/时钟周期,主频越高意味着时钟周期越短,假设一个时钟周期,mac的cpu可以执行1条汇编指令(编程之美取的是2条,但实验证明我的mac应该是1个时钟周期执行1条指令),所以我的电脑1s可以执行的汇编指令条数是3.1*10^9。
而一个for循环的汇编指令是5条,具体那5条干嘛的就先别管了(因为我也看不懂,这里也不需要懂),所以1s可以执行的for循环次数是3.1*10^9/5
用python计算一下:
>>>3.1*10**9/5
620000000.0
所以执行620000000次for循环是1s,然后再sleep 1s,再2s计算一次cpu占用率结果就是50%
c代码:
#include<stdio.h>
#include<unistd.h>
int
main ( )
{
for(;;){
for(long i = 0; i < 620000000; i++){
}
sleep(1);
}
return 0 ;
}
(我用的vim的cvim插件,这个int会跑到main上面。。看着别扭)
编译:
gcc main.c
执行:
./a.out
看下a.out的pid,方便用htop或者top命令查看cpu占用率:
ps aux | grep a.out
huangzhihao 79649 34.4 0.0 4268128 656 s000 S+ 2:27上午 0:02.93 ./a.out
第二列就是pid
查看cpu占用率
htop -d 20 -p 79649
Done!