在编程时突然想到为什么CPU会满负荷,我怎么样才能控制CPU的利用率? 感觉很有意思,我一开始是这么想的,CPU利用率跟运算类型有关,比如INT操作比float操作更费CPU。经过实验,基本没区别,看来跟这个没有关系。然后就应该是空闲时间的原因了。
还有一个问题是现在CPU都是多线程的,操作系统会自动调度到不同线程上去,所以就算画出来效果也不是很好。还好操作系统有库让我自定义调度到哪个线程或者说那个CPU核。具体操作:
1 2 3 4 5 6 7 | #include <sched.h> int main(){ unsigned long mask = 1; sched_setaffinity(0, sizeof(mask), &mask); return 0; } |
关于sched具体操作,自行man:
- man sched.h
- man sched_setaffinity
- man cpu_set
这个问题比较容易,现在已经可以试着画方波了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include <limits.h> #include <time.h> #include <sched.h> void runner(int sleeptime){ int i; clock_t time_0 = clock(); for(i = 0;i<3000000;++i){ if(clock() - time_0 > 1800){ time_0 = clock(); usleep(sleeptime); } } } int main(){ int i = 0; double f = 0.1; unsigned long mask = 1; sched_setaffinity(0, sizeof(mask), &mask); for(i=0;i<500;++i){ if(i%10 < 5){ runner(500); } if(i%10 == 5){ sleep(3); } } printf("sssss\n"); return 0; } |
接下去画了一下sin的,不太标准,有些问题没有解决,代码不贴,直接上图:
内存理论上来说比CPU简单,但是由于内存分配和释放需要一定时间,所以图像不是很准确,主要思想是运用malloc 和 free。实验中发现光malloc系统是没有真正分配内存的,只有memset或者赋值的时候,才会显示真正分配。下面来一张比较搓的图。