linux下测试写满cpu

来源:互联网 发布:优惠券由来 知乎 编辑:程序博客网 时间:2024/06/07 11:26

一、Linux下cpu的利用率
在Linux/Unix下,CPU利用率分为用户态,系统态和空闲态,分别表示CPU处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间。平时所说的CPU利用率是指:CPU执行非系统空闲进程的时间 / CPU总的执行时间。
二、测试
在编写测试程序时,采用多线程,为了使线程不因为时间片耗尽而被切换,将线程的调度策略设置为SCHED_FIFO,优先级设置为最大,每个线程处理的逻辑为一个死循环,使线程一直处于RUNNING态,一直占用cpu。测试代码如下:

#include<stdio.h>#include<unistd.h>#include<pthread.h>#include<stdlib.h>#include<string.h>#include<sched.h>void *pthrd_fun(void *arg){    while(1);}int main(){    pthread_t tid;    int i = 0;    struct sched_param param;    param.sched_priority = 99;    pthread_attr_t attr;    pthread_attr_init(&attr);     //修改线程的调度策略与优先级    pthread_attr_setschedpolicy(&attr,SCHED_FIFO);    pthread_attr_setschedparam(&attr,&param);    for(i = 0;i<=100;i++)    {        pthread_create(&tid,&attr,pthrd_fun,NULL);    }    while(1);    return 0;}

三、运行结果

    第一次执行代码之后,cpu占有率已经接近100%,此时,系统已经变得十分迟缓,shell响应变得十分慢。 

这里写图片描述

当增加创建的线程数之后,cpu达到了100%,只是无法看到,因为什么也运行不了,连shell也无响应。

备注:
1、linux内核的三种调度策略
①、SCHED_OTHER分时调度策略;
②、SCHED_FIFO实时调度策略,先到先服务;
③、SCHED_RR实时调度策略,时间片轮转。
注意:
①实时进程将得到优先调用,实时进程根据优先级决定调度权值,分时进程则
通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,

②两种实时调度策略对比:

SCHED_RR实时调度策略,时间片轮转。当进程的时间片用完,系统将重新分配时
间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平;

SCHED_FIFO实现了一种简单的,先入先出的调度算法:它不使用时间片,一旦一个SCHED_FIFO级进程处于可执行状态,就会一直执行,直到它自己受阻塞或显式的释放cpu为止。只有更高优先级的SCHED_FIFO或SCHED_RR才能抢占其任务。简而言之,一旦占用cpu则一直运行,直到有更高优先级任务到达或自己放弃。

SCHED_FIFO和SCHED_RR支持优先级的使用,优先级为(1~99),数值越大优先级越高。

2、更改线程调度策略及优先级
系统创建线程时,默认是SCHED_OTHER。所以如果我们要改变线程的调度策略的话,可以通过下面的这个函数实现。
int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
其中policy的取值为SCHED_FIFO/ SCHED_RR/ SCHED_OTHER.

改变线程的优先级:
int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
上面的param结构体为:
struct sched_param {
int sched_priority; //所要设定的线程优先级
};

原创粉丝点击