Linux线程优先级及属性小结

24 篇文章 3 订阅

介绍同一进程中的多个线程如何保持数据的私有性

Linux内核的几种调度策略:

    1.SCHED_OTHER  分时调度策略

    2.SCHED_FIFO      实时调度策略,先到先服务。一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃

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

    4.SCHED_BATCH   和1类似,用于批量执行(非标准)

    5.SCHED_IDLE  优先级比最大的nice还要低(非标准)

 

Linux线程优先级设置:

    首先,可以通过以下两个函数来获得线程可以设置的最高和最低优先级,函数中的策略即上述三种策略的宏定义:

  int sched_get_priority_max(int policy);
  int sched_get_priority_min(int policy);

注意:SCHED_OTHER 是不支持优先级使用的,它最大和最小优先级都是0,而 SCHED_FIFO 和 SCHED_RR 支持优先级的使用,他们分别为1和99,数值越大优先级越高。

 

设置和获取优先级通过以下两个函数:

int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);

例如:
param.sched_priority = 51; //设置优先级

系统创建线程时,默认的线程是 SCHED_OTHER。所以如果我们要改变线程的调度策略的话,可以通过下面的这个函数实现。

int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);

上面的param使用了下面的这个数据结构:

struct sched_param
{
    int __sched_priority; // 所要设定的线程优先级
};

 

linux线程属性

使用pthread_attr_t类型表示,我们需要对此结构体进行初始化

#include <pthread.h>

int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);   

pthread_attr_init之后,pthread_t结构所包含的内容就是操作系统实现支持的线程所有属性的默认值。

    
typedef struct
{
    int                           detachstate;     线程的分离状态
    int                           schedpolicy;   线程调度策略
    struct sched_param            schedparam;   线程的调度参数
    int                           inheritsched;    线程的继承性
    int                           scope;          线程的作用域
    size_t                        guardsize; 线程栈末尾的警戒缓冲区大小
    int                           stackaddr_set;
    void *                        stackaddr;      线程栈的位置
    size_t                        stacksize;       线程栈的大小
}pthread_attr_t;

如果pthread_attr_init实现时为属性对象分配了动态内存空间,pthread_attr_destroy还会用无效的值初始化属性对象,因此如果经 pthread_attr_destroy去除初始化之后的pthread_attr_t结构被pthread_create函数调用,将会导致其返回错误。

分离状态
线程的分离状态决定一个线程以什么样的方式来终止自己
           
我们已经在前面已经知道,在默认情况下线程是非分离状态的,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join() 函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。   
           
分离线程没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。

通俗的说也就是:我们知道一般我们要等待(pthread_join)一个线程的结束,主要是想知道它的结束状态,否则等待一般是没有什么意义的!但是if有一些线程的终止态我们压根就不想知道,那么就可以使用“分离”属性,那么我们就无须等待管理,只要线程自己结束了,自己释放src就可以咯!这样更方便!

#include <pthread.h>

int pthread_attr_getdetachstate(const pthread_attr_t * attr, int * detachstate);
int pthread_attr_setdetachstate(pthread_attr_t * attr, int detachstate);


/********************************
参数:attr:线程属性变量
      detachstate:分离状态属性   
若成功返回0,若失败返回-1。
           
设置的时候可以有两种选择:
<1>.detachstate参数为:PTHREAD_CREATE_DETACHED     分离状态启动
<2>.detachstate参数为:PTHREAD_CREATE_JOINABLE     正常启动线程
*************************************/

线程的继承性

函数pthread_attr_setinheritsched和pthread_attr_getinheritsched分别用来设置和得到线程的继承性!

继承性决定调度的参数是从创建的进程中继承还是使用在 schedpolicy和schedparam属性中显式设置的调度信息。

可设置参数:
PTHREAD_INHERIT_SCHED: 新的线程继承创建线程的策略和参数!
PTHREAD_EXPLICIT_SCHED:新的线程继承策略和参数来自于schedpolicy和schedparam属性中显式设置的调度信息!

 #include <pthread.h>

int pthread_attr_getinheritsched(const pthread_attr_t *attr,int *inheritsched);
int pthread_attr_setinheritsched(pthread_attr_t *attr,int inheritsched);

/******************************
参数:
attr                线程属性变量
inheritsched     线程的继承性
若成功返回0,若失败返回-1。
*******************************/          

线程的作用域

以下函数分别用来设置和得到线程的作用域。

#include <pthread.h>   
int    pthread_attr_getscope( const pthread_attr_t * attr, int * scope );
int    pthread_attr_setscope( pthread_attr_t*, int scope );

作用域控制线程是否在进程内或在系统级上竞争资源,可能的值是
PTHREAD_SCOPE_PROCESS(进程内竞争资源)
PTHREAD_SCOPE_SYSTEM   (系统级竞争资源)。

线程堆栈的大小

int pthread_attr_getstacksize(const pthread_attr_t *,size_t * stacksize);
int pthread_attr_setstacksize(pthread_attr_t *attr ,size_t *stacksize);

 

Linux中,线程优先级可以通过sched_param结构体中的sched_priority字段来设置。可以使用pthread_attr_setschedparam函数来设置线程优先级,传入的参数为一个指向pthread_attr_t结构体的指针和一个指向sched_param结构体的指针。通过设置sched_param结构体中的sched_priority字段来设置线程优先级优先级范围为0~99,其中0为普通优先级,数值越大优先级越高。 此外,Linux中的线程优先级可以分为静态优先级和动态优先级。静态优先级范围为0~99,其中0级为普通优先级,1~99级为实时线程。动态优先级是指在静态优先级为0时,通过nice值来区分优先级,nice值范围为-19~20,nice值越大,优先级越低。例如,如果有两个静态优先级为0的线程p1和p2,p1的nice值为20,p2的nice值为-10,则p2的优先级比p1更高。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Linux 线程调度与优先级](https://blog.csdn.net/modi000/article/details/125077677)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Linux-线程调度与优先级](https://blog.csdn.net/u014583317/article/details/109413059)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值