线程优先级属性

在任务的概念当中由于运行的需求,我们常常需要给任务一定分类,在系统里面就诞生出来所谓线程优先级
实时线程
        单位时间相应能力强,里面拥有1-99个静态优先级,数字越大,优先级越高(所谓的优先级指的经过特殊的处理,我们可以让某个人物能够在系统中被更优先的响应,从而分出的从高到低的级别),需要有管理员权限才能启动实时线程

特点:

实时线程分99个静态优先级,数字越大,优先级越高
高优先级的实时线程会完全抢占低优先级实时线程的资源(指令运行资源)
在实时线程当中支持抢占调度策略跟轮询调度策略
拥有抢占所有实时线程运行资源的能力
必须拥有超级用户权限才能够运行

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

特点:

非实时线程只有一个静态优先级,所以同时非实时线程的任务无法抢占他人的资源
在非实时线程当中只支持其他调度策略(自动适配的,系统分配的调度策略)
不拥有抢占所有运行资源的能力
支持动态优先级系统自适应,从-20到19的动态优先级(nice值)

线程中支持三种调度策略:

1.抢占式调度策略,在同一静态优先级的情况下,抢占调度策略的线程一旦运行到便会一直抢占CPU资源,而其他同一优先级的只能一直等到这个抢占式调度策略的线程退出才能被运行到(非实时线程会有一小部分资源分配到)
2.轮询式调度策略,在同一静态优先级的情况下,大家一起合理瓜分时间片,不会一直抢占CPU资源(非实时线程会有一小部分资源分配到)
3.其他普通式调度策略,只能作用于非实时线程,由系统自动分配时间片,并且根据运行状态自动分配动态优先级
注意点:

抢占式调度策略跟轮询式调度策略只能在实时线程中被设置,也就是静态优先级1-99的区域内设置,普通非实时线程不能设置

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

#include <pthread.h> int pthread_attr_setinheritsched(pthread_attr_t *attr,int inheritsched);

函数功能:

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

参数:

attr:线程属性结构体地址
inheritsched:是否继承父线程的调度策略
PTHREAD_EXPLICIT_SCHED:不继承,只有不继承父线程的调度策略才可以设置线程的调度策略
PTHREAD_INHERIT_SCHED:继承父进程的调度策略

返回值:

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

pthread_attr_setschedpolicy  设置线程的调度策略

#include <pthread.h> int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);

函数功能:

设置线程的调度策略属性

参数:

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

  • SCHED_FIFO:抢占式调度,同一优先级中,一旦运行到设置了这个参数的线程CPU将会一直被该线程所占领,不会分配资源给其他实时线程,会分配一点资源给非实时线程
  • SCHED_RR:轮询式调度,同一优先级总,遇到这个设置的线程,将会给其运行一段时间后,又继续给下一个人运行(相当于大家平均运行),会分配一点资源给非实时线程上面的两种是针对静态优先级1-99的实时线程才能设置的。
  • SCHED_OTHER:其他普通的调度策略,仅能设置与0静态优先级,也就是非实时线程,让这条线程成为一个由系统去自动根据动态优先级分配资源的任务。

返回值:

成功的情况下,返回值为0,失败返回非0值,errno不会被设置
pthread_attr_setschedparam  设置静态优先级

函数功能:

  • 设置静态优先级

参数:

struct sched_param {     int sched_priority;     /* Scheduling priority */
}

返回值:

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

获取静态优先级的最小值与最大值的函数
获取最小值:

sched_get_priority_min(SCHED_FIFO);
获取最大值:

sched_get_priority_max(SCHED_FIFO);
例程:测试分离属性以及栈大小

例程:测试分离属性以及栈大小

#define _GNU_SOURCE      //注意这个宏定义不要漏了
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>void *new_thread(void *arg)
{int retval;pthread_attr_t myattr;size_t stack_size;/*  //这个函数使用后,时灵时不灵,不建议使用retval = pthread_detach(pthread_self());if(retval != 0){fprintf(stderr, "设置分离失败:%s\n", strerror(retval));}
*/  //获取本线程的属性存放到myattr这个变量中pthread_getattr_np(pthread_self(), &myattr);//获取线程栈的大小pthread_attr_getstacksize(&myattr, &stack_size);printf("stack size = %ld\n", stack_size);while(1){sleep(1);printf("in thread\n");}return NULL;
}int main(void)
{pthread_t tid;pthread_attr_t attr;//线程属性初始化pthread_attr_init(&attr);//设置线程的属性成为完全分离状态,再也不能用pthread_join来等待这条线程pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED);//设置线程的栈大小pthread_attr_setstacksize(&attr, 16*1024*1024);//取消行程,后面篇章详细描写pthread_create(&tid, &attr, new_thread, NULL);//线程属性销毁pthread_attr_destroy(&attr);//线程的属性成为完全分离状态,再也不能用pthread_join来等待这条线程//pthread_join(tid, NULL);//等待线程退出return 0;
}

例程:测试优先级

注意:只有在CPU只有一个内核才看得出效果

同时改变优先级还需要系统超级用户权限(没有超级用户权限,不给你执行,所以一般情况下很少会设置优先级)

虚拟机设置单核如下>>虚拟机设置=>硬件=>处理器     此处可以设置CPU数量和核数

#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>
#include <sched.h>void *start_routine(void *arg)
{int i, j;while(1){fprintf(stderr, "%c ", *(char *)arg);for(i=0; i<100000; i++)for(j=0; j<1000; j++);}pthread_exit(NULL);
}int main(void)
{pthread_t tid1, tid2, tid3;pthread_attr_t attr1, attr2;struct sched_param param1, param2;/* 线程属性变量的初始化 */pthread_attr_init(&attr1);pthread_attr_init(&attr2);/* 设置线程是否继承创建者的调度策略 PTHREAD_EXPLICIT_SCHED:不继承才能设置线程的调度策略*/errno = pthread_attr_setinheritsched(&attr1, PTHREAD_EXPLICIT_SCHED);if(errno != 0){perror("setinherit failed\n");return -1;}/* 设置线程是否继承创建者的调度策略 PTHREAD_EXPLICIT_SCHED:不继承才能设置线程的调度策略*/errno = pthread_attr_setinheritsched(&attr2, PTHREAD_EXPLICIT_SCHED);if(errno != 0){perror("setinherit failed\n");return -1;}/* 设置线程的调度策略:SCHED_FIFO:抢占性调度; SCHED_RR:轮寻式调度;SCHED_OTHER:非实时线程调度策略*/errno = pthread_attr_setschedpolicy(&attr1, SCHED_RR);if(errno != 0){perror("setpolicy failed\n");return -1;}errno = pthread_attr_setschedpolicy(&attr2, SCHED_RR);if(errno != 0){perror("setpolicy failed\n");return -1;}//设置优先级的级别param1.sched_priority = 1;param2.sched_priority = 1;//查看抢占性调度策略的最小跟最大静态优先级的值是多少printf("min=%d, max=%d\n", sched_get_priority_min(SCHED_FIFO), sched_get_priority_max(SCHED_FIFO));/* 设置线程静态优先级 */errno = pthread_attr_setschedparam(&attr1, &param1);if(errno != 0){perror("setparam failed\n");return -1;}errno = pthread_attr_setschedparam(&attr2, &param2);if(errno != 0){perror("setparam failed\n");return -1;}/* 创建三个测试线程 *//* 线程1,优先级1 */errno = pthread_create(&tid1, &attr1, start_routine, (void *)"1");if(errno != 0){perror("create thread 1 failed\n");return -1;}/* 线程2,优先级1 */errno = pthread_create(&tid2, &attr2, start_routine, (void *)"2");if(errno != 0){perror("create thread 2 failed\n");return -1;}/* 线程3,非实时线程,静态优先级0 */errno = pthread_create(&tid3, NULL, start_routine, (void *)"3");if(errno != 0){perror("create thread 3 failed\n");return -1;}pthread_join(tid1, NULL);pthread_join(tid2, NULL);pthread_join(tid3, NULL);pthread_attr_destroy(&attr1);pthread_attr_destroy(&attr2);return 0;
}

设置抢占性调度结果: SCHED_FIFO

可以看得到,在抢占性调度下,线程2一点资源都没有分配到

设置轮寻式调度结果: SCHED_RR

可以看得到,在轮寻式调度下,线程1和2资源分配很和谐

刚运行CPU就跑满了

以上俩结果中的线程3是非实时线程静态优先级0,不管怎么样系统都会给平民线程分配一点点资源,就一点点。

pthread_attr_setinheritsched,pthread_attr_setschedparam函数详解相关推荐

  1. C语言网络编程:accept函数详解

    文章目录 前言 函数描述 代码实例 如何得到客户端的IP 和 端口号 前言 当使用tcp服务器使用socket创建通信文件描述符,bind绑定了文件描述符,服务器ip和端口号,listen将服务器端的 ...

  2. 【FFmpeg】函数详解(三)

    FFmpeg函数详解 14.av_write_frame 15.av_interleaved_write_frame 16.av_write_trailer 17.avio_close 18.av_i ...

  3. 【FFmpeg】函数详解(二)

    FFmpeg函数详解 9.av_dump_format 10.avio_open 11.avformat_write_header 12.avcodec_send_frame 13.avcodec_r ...

  4. 【FFmpeg】函数详解(一)

    FFmpeg函数详解 一.错误码相关 1.AVERROR 2.av_strerror 3.其他错误码解释 二.编解码 1.获取编解码器 2.申请.释放上下文环境 3.打开编码器avcodec_open ...

  5. 【ES6】Generator函数详解

    [ES6]Generator函数详解 一.Generator函数简介 基本概念 函数写法 yield关键字介绍 二.next方法的参数 三.for...of循环 四.关于普通throw()与Gener ...

  6. mysql的聚合函数综合案例_MySQL常用聚合函数详解

    一.AVG AVG(col) 返回指定列的平均值 二.COUNT COUNT(col) 返回指定列中非NULL值的个数 三.MIN/MAX MIN(col):返回指定列的最小值 MAX(col):返回 ...

  7. python平方数迭代器_对python中的高效迭代器函数详解

    python中内置的库中有个itertools,可以满足我们在编程中绝大多数需要迭代的场合,当然也可以自己造轮子,但是有现成的好用的轮子不妨也学习一下,看哪个用的顺手~ 首先还是要先import一下: ...

  8. python基础知识~ 函数详解2

    python~函数详解2  1 生成器函数    定义 如果函数有yield这个关键字,就是生成器函数.生成器函数() 获取的是生成器,不执行函数   须知 yield和return一样,都可以返回数 ...

  9. scanf函数详解与缓冲区

    1.基本信息 函数原型: int scanf( char *format, args, ...); 函数返回值: 读入并赋给args的数据个数,遇到文件结束返回EOF,出错返回0. 函数功能: sca ...

  10. pythonpandas函数详解_对pandas中Series的map函数详解

    Series的map方法可以接受一个函数或含有映射关系的字典型对象. 使用map是一种实现元素级转换以及其他数据清理工作的便捷方式. (DataFrame中对应的是applymap()函数,当然Dat ...

最新文章

  1. 学计算机应用好还是汽车维修好,大学汽车运用与维修专业怎么样_学什么_前景好吗-520吉他网...
  2. 澳大利亚研究者研制出一种计算机芯片 他们,快讯:几乎看不见的3D打印机器人;西澳大利亚大学的研究人员开发出一种保护生态机器鱼;效率达CPU一万倍的神经形态芯片发布!...
  3. 一个小的日常实践——距离阵列
  4. 技术干货 | 高性能短链设计与实现
  5. 解决MyBatis的报错 There is no getter for property named ‘*‘ in ‘class java.lang.String‘
  6. 浏览器是如何工作的系列:渲染引擎
  7. discuz邮件设置PHP,Discuz!6.0—如何配置发送邮件的参数
  8. 苹果断开电脑连接服务器无响应,mac电脑iTerm2链接linux服务器断线解决方案
  9. (转)淘淘商城系列——引用dubbo服务
  10. 【杂谈】Opera10.62的Flash 10插件在WIN 7下无法安装的问题
  11. GDAL C#版本 安全透明方法问题解决方案
  12. iOS开发中常用的宏
  13. 电话本写完了,发个1.0吧
  14. TCP/IP协议分层模型以及数据的封装和分用
  15. emacs linux 教程,Emacs基础入门教程(三)使用 Emacs 必知必会
  16. 使用C#进行数据库增删改查(一)
  17. 北京航空航天大学计算机学院院长,胡勇 中文主页 北京航空航天大学教师个人主页系统...
  18. Mysql——分组查询
  19. PDF文件怎么拆分?看完就会了!
  20. GP——数据库常用命令

热门文章

  1. 单反相机tf卡用sd卡套稳定吗_存储卡可不是插上就能用 单反相机的使用细节
  2. AES MODE_GCM
  3. 随滚动条移动的QQ在线客服代码
  4. 超级记忆/图像数字记忆 110位数字图像转换表 61-70
  5. 全网搜索 6.0 - 超级网搜 SuperSearch 最新版 - 主要更新内容
  6. 2007.12.25 2个意外惊喜
  7. 如何把avi转换为mp4?视频转换用嗨格式视频转换器
  8. Java并发练习:无锁编程
  9. SpaceSniffer 内存管理 空间嗅探器内存清理神器
  10. 计数显示器c语言程序,单片机计数显示器.doc