当在属性对象中设置调度策略或优先级时,必须同时设置inheritsched属性(即继承属性设置为:PTHREAD_EXPLICIT_SCHED)。

linux内核的三种调度方法:

  • SCHED_OTHER 分时调度策略
  • SCHED_FIFO实时调度策略,先到先服务
  • SCHED_RR实时调度策略,时间片轮转

实时进程将得到优先调用,实时进程根据实时优先级决定调度权值,分时进程则通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了cpu最少的进程将会得到优先调度。

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

SCHED_FIFO一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃。如果有相同优先级的实时进程(根据优先级计算的调度权值是一样的)已经准备好,FIFO时必须等待该进程主动放弃后才可以运行这个优先级相同的任务。而RR可以让每个任务都执行一段时间。

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg); 来创建线程,但是如何设置线程的优先级呢? 在讨论这个问题的时候,我们先要确定当前线程使用的调度策略,posix提供了 int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);

函数来获取所使用的调度策略,它们是:SCHED_FIFO, SCHED_RR 和 SCHED_OTHER。

我们可以使用: int sched_get_priority_max(int policy); int sched_get_priority_min(int policy); 来获取线程线程可是设置的最大和最小的优先级值,如果调用成功就返回最大和最小的优先级值,否则返回-1。 从我现在运行的linux系统中,我使用下列程序(程序见附录)获取了对应三种调度策略中的最大和最小优先级: policy = SCHED_OTHER Show current configuration of priority max_priority = 0 min_priority = 0 Show SCHED_FIFO of priority max_priority = 99 min_priority = 1 Show SCHED_RR of priority max_priority = 99 min_priority = 1 Show priority of current thread priority = 0 Set thread policy Set SCHED_FIFO policy policy = SCHED_FIFO Set SCHED_RR policy policy = SCHED_RR Restore current policy policy = SCHED_OTHER

我们可以看到SCHED_OTHER是不支持优先级使用的,而SCHED_FIFO和SCHED_RR支持优先级的使用,他们分别为1和99,数值越大优先级越高。 从上面的结果我们可以看出,如果程序控制线程的优先级,一般是用pthread_attr_getschedpolicy来获取系统使用的调度策略,如果是SCHED_OTHER的话,表明当前策略不支持线程优先级的使用,否则可以。当然所设定的优先级范围必须在最大和最小值之间。我们可以通过sched_get_priority_max和sched_get_priority_min来获取。

#include    <stdio.h>
#include    <stdlib.h>
#include    <unistd.h>
#include    <pthread.h>
#include    <signal.h>
#include    <string.h>
void * thr_fun(void *arg)
{int policy, ret;struct sched_param param;//获取线程调度参数ret = pthread_getschedparam(pthread_self(), &policy, &param);if(ret!=0){printf("pthread_getschedparam %s\n", strerror(ret) );exit(1);}if (policy == SCHED_FIFO){printf("policy:SCHED_FIFO\n");}else if (policy == SCHED_OTHER){printf("policy:SCHED_OTHER\n");}else if (policy == SCHED_RR){printf("policy:SCHED_RR\n");}printf("param: %d\n", param.sched_priority);printf("pthread getpid = %d\n",getpid());long long i;while (1) {i++;i *= 2;}pthread_exit(NULL);
}
int main(int argc,char *argv[])
{int ret;pthread_t tid;pthread_attr_t attr;int policy, inher;struct sched_param param;//初始化线程属性pthread_attr_init(&attr);//获取继承的调度策略ret = pthread_attr_getinheritsched(&attr, &inher);if (ret!=0){printf("pthread_attr_getinheritsched %s\n", strerror(ret));exit(1);}if (inher == PTHREAD_EXPLICIT_SCHED){printf("PTHREAD_EXPLICIT_SCHED\n");}else if (inher == PTHREAD_INHERIT_SCHED){printf("PTHREAD_INHERIT_SCHED\n");inher = PTHREAD_EXPLICIT_SCHED;}//设置继承的调度策略//必需设置inher的属性为 PTHREAD_EXPLICIT_SCHED,否则设置线程的优先级会被忽略ret = pthread_attr_setinheritsched(&attr, inher);if (ret!=0){printf("pthread_attr_setinheritsched %s\n", strerror(ret));exit(1);}sleep(1);policy = SCHED_FIFO;//在Ubuntu10.04上需要root权限//设置线程调度策略ret = pthread_attr_setschedpolicy(&attr, policy);if (ret!=0){printf(" pthread_attr_setschedpolicy%s\n", strerror(ret));exit(1);}param.sched_priority = 3;//设置调度参数ret = pthread_attr_setschedparam(&attr, &param);if (ret!=0){printf(" pthread_attr_setschedparam %s\n", strerror(ret));exit(1);}//创建线程ret = pthread_create(&tid, &attr, thr_fun, NULL);if (ret!=0){printf("pthread_create %s\n", strerror(ret));exit(1);}printf("main getpid = %d\n",getpid());sleep(5);while (1) {printf("hello world\n");printf("getpid = %d\n",getpid());}pthread_join(tid, NULL);pthread_exit(NULL);
}

root@# top -H

Priority 3 FIFO [99-100-3=-4]???

root@:/proc/3408/task/3409# cat sched

实时进程优先级:

prio = MAX_RT_PRIO(100)– 1 – rt_priority(3)= 96;

policy:

0 SCHED_OTHER 
1.SCHED_FIFO 
2.SCHED_RR

转载于:https://www.cnblogs.com/wangfengju/archive/2013/05/10/6173111.html

posix多线程有感--线程高级编程(线程调度以及优先级设置)相关推荐

  1. posix多线程有感--线程高级编程(线程和fork,exec)

    当多线程进程调用fork创建子进程时,Pthreads指定只有那个调用fork的线程在子进程内存在(表示子进程中只有调用线程这个线程).尽管当从fork调用返回时,只有调用线程在子进程中存在,所有其他 ...

  2. posix多线程有感--线程高级编程(条件变量)

    1.初始化条件变量pthread_cond_init int pthread_cond_init(pthread_cond_t *cv,const pthread_condattr_t *cattr) ...

  3. java.util.concurrent 多线程框架---线程池编程(四)

    java.util.concurrent 结构 Sync:获得/释放(acquire/release) 协议.同步(定制锁.资源管理.其他同步) Channel:放置/取走(put/take) 协议. ...

  4. posix多线程有感--API

    一.头文件 #include <pthread.h> 二.编译选项 -lpthread 三.结构体 pthread_t pthread_attr_t pthread_barrier_t p ...

  5. 《POSIX多线程程序设计》读书笔记

    <POSIX多线程程序设计>读书笔记 一.      概述 1.    一个UNIX进程可以理解为一个线程加上地址空间.文件描述符和其他数据: 2.    多个线程可以共享一个地址空间,而 ...

  6. c语言怎么设置cpu优先级,线程优先级,设置,setPriority()方法

    package seday08.thread; /** * @author xingsir * 线程优先级 * 线程启动后纳入到线程调度,线程时刻处于被动获取CPU时间片而无法主动获取.我们可以通过调 ...

  7. Posix多线程编程—线程属性

    一.线程属性 线程具有属性,用pthread_attr_t表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化.我们用pthread_attr_init函数对其初始化,用pthrea ...

  8. 带你了解Java高级编程-----多线程

    带你了解Java高级编程-----多线程 对于Java的学习,基本的步骤是Java基础编程,掌握了Java语言的基本语法.数组.面向对象编程.异常处理这四部分之后,就要开始对Java高级编程进一步学习 ...

  9. PHP 高级编程之多线程

    PHP 高级编程之多线程 http://netkiller.github.io/journal/thread.php.html Mr. Neo Chen (netkiller), 陈景峰(BG7NYT ...

  10. LinuxC高级编程——线程间同步

    LinuxC高级编程--线程间同步 宗旨:技术的学习是有限的,分享的精神是无限的. 1. 互斥锁mutex 多个线程同时访问共享数据时可能会冲突.对于多线程的程序,访问冲突的问题是很普遍的,解决的办法 ...

最新文章

  1. “智慧血联网平台”亮相军民融合技术装备博览会
  2. linux上传下载文件
  3. YARN 任务执行报错:Caused by: java.io.IOException: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out
  4. java的比较器_java两种比较器总结
  5. RHEL5下的DHCP服务和DHCP中继
  6. 深入理解 Java 内存模型(一)——基础
  7. java根据pdf模版动态生成pdf
  8. 嵌入式电路设计(入门)
  9. bilibili直播: Vue.js Podcast(小记录)~~~
  10. LeetCode刷题第5周小结
  11. 理论+实验:LAMP网站服务器部署(超详细版本)
  12. 计算机管理服务器,用勤哲Excel服务器实现计算机管理系统
  13. 网页设计作业——小米商城官网首页(1页) HTML+CSS+JavaScript web期末作业设计网页_清新淡雅个人网页大学生网页设计作业成品
  14. dubbo中标签的使用
  15. 【大数据】快速了解大数据计算服务
  16. 战列舰机械计算机,Goliath
  17. PMBOK(项目管理实践指南)绝不是PMP考试的指定教材,看完你就知道
  18. 查看hive的当前参数值
  19. 只允许微信浏览器访问
  20. 输入三角形边长,求三角形面积

热门文章

  1. 【2018蓝桥省赛A组C/C++】全球变暖(两次bfs+状态标记 or 一次dfs)
  2. 教育部计算机考研大纲,2021考研计算机大纲计算机组成原理部分考查内容
  3. mysql增加超级用户_Mysql添加远程超级用户
  4. mysql权限查看_教您如何查看MySQL用户权限
  5. 阿里云云计算 38 PolarDB MySQL的数据管理
  6. iNOC产品部--完全数计算
  7. Juggling Life and Learning
  8. cad相对坐标快捷键_CAD入门必记的15个命令,只要熟悉这15个命令几乎就可以走遍天下...
  9. python把float可以转变成int_在Python中将float转换为整数的最安全方法?
  10. 凸优化第六章逼近与拟合 6.4鲁棒逼近