系统环境:ubuntu12.04
今天看到一题:写一个程序,让你的CPU使用率在50%。
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include<unistd.h>
4 int main(int argc,char *argv[])
5 {
6 long i;
7 while(1)
8 {
9 for(i = 0;i < 8690000; i++)
10 usleep(60);
11 }
12 return 0;
13 }
14
《一》程序运行时间:
一个进程的运行时间大致分为user time,kernel time和waiting time
三个时间加起来就是进程从开始到结束用的时间。
user time是进程在用户空间执行的时间
kernel time是进程在内核空间执行的时间
waiting time是进程等待IO或者其他事件所用的时间
例如:
1 #include <stdio.h>2 int main()
3 {
4 int i;
5 for(i = 0; i < 100000000; i ++) //用户空间执行
6 getpid(); //系统调用,内核空间执行
7 /*scanf和printf是C标准库里的,还要调用Linux的系统调用read和write*/
8 scanf("%d\n",&i);
9 printf("%d\n",i);
10 return 0;
11 }
使用time命令可以显示进程运行的时间,real,user,sys。大部分时间都用来等IO了,因为人输入的速度远小于计算机的速度。
CPU的使用率是指所有进程的user time和kernel time之和除以real time。而一般情况下,user time远大于kernel time。
《二》让CPU一直维持在50%
只要让进程50%的时间做循环,%50的时间sleep就行了。
- int main()
- {
- int i;
- while(1)
- {
- for(i = 0; i < n; i++);
- usleep(m);
- }
- return 0;
- }
- .L2:
- movl $0, -8(%ebp)
- jmp .L3
- .L4:
- addl $1, -8(%ebp)
- .L3:
- cmpl $3999999, -8(%ebp)
- jle .L4
- movl $60000, (%esp)
- call usleep
- jmp .L2
CPU100这个进程CPU的使用率达到49%了。接近50.
但是我们发现最上面的CPU使用率达到68.8%,这是因为我们还有其他的进程在使用。