linux 线程的调度策略

目录

一、调度策略

1.实时线程

2.非实时线程

3.抢占式调度策略

运行特点:

4.轮询式调度策略

运行特点:

二、设置线程的调度策略步骤

1.定义线程句柄

2.定义线程属性结构体

3.初始化属性结构体

4.设置线程是否继承父线程调度策略

5.设置线程的调度策略属性

6.设置优先级

7.创建线程

三、示例代码



 

一、调度策略

共有三种调度策略,可分为实时线程调度策略和非实时线程调度策略

包括 SCHED_OTHER(正常、非实时)、SCHED_RR(实时、轮 转法)和SCHED_FIFO(实时、先入先出)三种,缺省为  SCHED_OTHER,后两种调度策略仅对超级用户有效

1.实时线程

单位时间相应能力强,里面拥有1-99个静态优先级,数字越大,优先级越高

需要有管理员权限才能启动实时线程

特点:

1.实时线程分99个静态优先级,数字越大,优先级越高

2.高优先级的实时线程会完全抢占低优先级实时线程的资源(指令运行资源)

3.在实时线程当中支持抢占调度策略轮询调度策略

4.拥有抢占所有实时线程运行资源的能力

5.必须拥有超级用户权限才能够运行

2.非实时线程

单位时间中,并没有过分的去在乎响应能力的一个线程,里面只有一个静态优先级0,也就是在非实时线程中,它是没有静态优先级的概念的,他的所有的执行过程都是由系统自动分配的

特点:

1.非实时线程只有一个静态优先级,所以同时非实时线程的任务无法抢占他人的资源

2.在非实时线程当中只支持其他调度策略(自动适配的,系统分配的调度策略)

3.支持动态优先级系统自适应,从-20到19的动态优先级(nice值)

3.抢占式调度策略

运行特点:

同一静态优先级的情况下,抢占调度策略的线程一旦运行到便会一直抢占CPU资源,而其他同一优先级的只能一直等到这个抢占式调度策略的线程退出才能被运行到(非实时线程会有一小部分资源分配到

4.轮询式调度策略

运行特点:

同一静态优先级的情况下,大家一起合理瓜分时间片,不会一直抢占CPU资源(非实时线程会有一小部分资源分配到)

二、设置线程的调度策略步骤

1.定义线程句柄

pthread_t thread

2.定义线程属性结构体

pthread_attr_t attr

3.初始化属性结构体

pthread_attr_init(&attr);

4.设置线程是否继承父线程调度策略

只有不继承父线程的调度策略才可以设置线程的调度策略

pthread_attr_setinheritsched(&attr,PTHREAD_EXPLICIT_SCHED);

PTHREAD_EXPLICIT_SCHED:不继承

PTHREAD_INHERIT_SCHED:继承父进程的调度策略

5.设置线程的调度策略属性

函数原型:

int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);

参数:attr:线程属性结构体地址     policy:调度策略

返回值:成功的情况下,返回0,失败返回非0值,errno不会被设置

例:

pthread_attr_setschedpolicy(&attr,SCHED_FIFO);//抢占式调度策略

6.设置优先级

当调度策略为实时(即 SCHED_RR或SCHED_FIFO)时才有效

在运行时通过 pthread_setschedparam()函数来改变,缺省为0。

pthread_attr_setschedparam  函数功能:设置静态优先级

参数:

attr:线程属性结构体地址

param:优先级结构体,里面只有元素sched_priority

返回值:成功的情况下,返回值为0,失败返回非0值,errno不会被设置

例:

struct sched_param param;

param.sched_priority=1;

pthread_attr_setschedparam(&attr,¶m);

7.创建线程

rc = pthread_create( &thread,&attr,thread_one,(void *)"1");

三、示例代码

#include 
#include 
#include 
#include 
#include 

void *thread_one(void * arg)
{
    int i,j;
    while (1)
    {fprintf(stderr,"%c",*(char *)arg);
    for (i = 0; i < 100000; i++)
        for(j = 0;j < 1000; j++);
    }
    
}

int main(int arg,char ** argv)
{
    int res,rc1,rc2,rc3;
    pthread_t thread1,thread2,thread3;
    long t=100;
    long result2;
    pthread_attr_t attr1,attr2,attr3;//未初始化,attr里面的值为空
    struct sched_param param1,param2;
    pthread_attr_init(&attr1);//初始化,attr的值为默认值
    pthread_attr_init(&attr2);
    pthread_attr_setinheritsched(&attr1,PTHREAD_EXPLICIT_SCHED);//不继承,只有不继承父线程的调度策略才可以设置线程的调度策略
    pthread_attr_setinheritsched(&attr2,PTHREAD_EXPLICIT_SCHED);
    pthread_attr_setschedpolicy(&attr1,SCHED_FIFO);//抢占式调度策略
    pthread_attr_setschedpolicy(&attr2,SCHED_FIFO);//抢占式调度策略
    param1.sched_priority=1;
    param2.sched_priority=1;
    pthread_attr_setschedparam(&attr1,¶m1);
    pthread_attr_setschedparam(&attr2,¶m2);
    //pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//设置线程分离态,pthread_join()失效
    rc1 = pthread_create( &thread1,&attr1,thread_one,(void *)"1");
    rc2 = pthread_create( &thread2,&attr2,thread_one,(void *)"2");
    rc3 = pthread_create( &thread3,NULL,thread_one,(void *)"3");
    pthread_attr_destroy(&attr1);//删除属性
    pthread_attr_destroy(&attr2);
    pthread_join(thread1,NULL);
    pthread_join(thread2,NULL);
    pthread_join(thread3,NULL);
}

你可能感兴趣的:(linux操作系统,linux)