Linux线程调度

代码如下:

  1 #include <stdio.h>
  2 #include <pthread.h>
  3 #include <sched.h>
  4 #include <assert.h>
  5
  6 static int api_get_thread_policy(pthread_attr_t *attr)
  7 {
  8     int policy = 0;
  9     int rs = 0;
 10
 11     rs = pthread_attr_getschedpolicy(attr, &policy);
 12     assert(0 == rs);
 13
 14     switch(policy)
 15     {
 16         case SCHED_FIFO:
 17             printf("policy = SCHED_FIFO\n");
 18             break;
 19         case SCHED_RR:
 20             printf("policy = SCHED_RR\n");
 21             break;
 22         case SCHED_OTHER:
 23             printf("policy = SCHED_OTHER\n");
 24             break;
 25         default:
 26             printf("policy = UNKNOWN\n");
 27             break;
 28     }
 29
 30     return policy;
 31 }
 32
 33 static void api_set_thread_policy(pthread_attr_t *attr, int policy)
 34 {
 35     int rs = 0;
 36
 37     rs = pthread_attr_setschedpolicy(attr, policy);
 38     assert(0 == rs);
 39     (void)api_get_thread_policy(attr);
 40 }
 41
 42 static void api_show_thread_priority(int policy)
 43 {
 44     int priority = 0;
 45
 46     priority = sched_get_priority_max(policy);
 47     assert(-1 != priority);
 48     printf("max_priority = %d\n", priority);
 49
 50     priority = sched_get_priority_min(policy);
 51     assert(-1 != priority);
 52     printf("min_priority = %d\n", priority);
 53 }
 54
 55 static int api_get_thread_priority(pthread_attr_t *attr)
 56 {
 57     struct sched_param param;
 58     int rs = 0;
 59
 60     rs = pthread_attr_getschedparam(attr, &param);
 61     assert(0 == rs);
 62     printf("priority = %d\n", param.__sched_priority);
 63
 64     return param.sched_priority;
 65 }
 66
 67 static void api_set_thread_priority(pthread_attr_t *attr, int priority)
 68 {
 69     struct sched_param param;
 70     int rs = 0;
 71
 72     rs = pthread_attr_getschedparam(attr, &param);
 73     assert(0 == rs);
 74
 75     param.__sched_priority = priority;
 76     rs = pthread_attr_setschedparam(attr, &param);
 77     assert(0 == rs);
 78
 79     (void)api_get_thread_priority(attr);
 80 }
 81
 82 //int api_set_policy_priority_main()
 83 int main()
 84 {
 85     pthread_attr_t attr;
 86     int rs = 0;
 87
 88     rs = pthread_attr_init(&attr);
 89     assert(0 == rs);
 90
 91     int policy = api_get_thread_policy(&attr);
 92
 93     printf("Show current configuration of priofity\n");
 94     api_show_thread_priority(policy);
 95
 96     printf("Show SCHED_FIFO of priority\n");
 97     api_show_thread_priority(SCHED_FIFO);
 98
 99     printf("Show SCHED_RR of priority\n");
100     api_show_thread_priority(SCHED_RR);
101
102     printf("Show priority of current thread\n");
103     int priority = api_get_thread_priority(&attr);
104
105     printf("Set SCHED_FIFO policy\n");
106     api_set_thread_policy(&attr, SCHED_FIFO);
107
108     printf("Set SCHED_RR policy\n");
109     api_set_thread_policy(&attr, SCHED_RR);
110
111     printf("Restore current policy\n");
112     api_set_thread_policy(&attr, policy);
113
114     printf("Restore current priority\n");
115     api_set_thread_priority(&attr, priority);
116
117     rs = pthread_attr_destroy(&attr);
118     assert(0 == rs);
119
120     return 0;
121 }

原文地址:https://www.cnblogs.com/live-program/p/12625384.html

时间: 2024-10-31 04:31:40

Linux线程调度的相关文章

浅析Linux线程调度

在Linux中,线程是由进程来实现,线程就是轻量级进程( lightweight process ),因此在Linux中,线程的调度是按照进程的调度方式来进行调度的,也就是说线程是调度单元.Linux这样实现的线程的好处的之一是:线程调度直接使用进程调度就可以了,没必要再搞一个进程内的线程调度器.在Linux中,调度器是基于线程的调度策略(scheduling policy)和静态调度优先级(static scheduling priority)来决定那个线程来运行. 对于下面三种调度策略SCH

Linux线程调度引起的业务问题

一. 问题现象 1.业务组播出向报文偶尔有延迟: 2.单播出向报文平滑 二. 分析及定位 使用wireshark分析了组播出向报文的抓包,报文无丢包,但是IO 输出流量显示有burst和掉坑现象. 波形和抓包文件分析如下图: 后来在接收侧抓包,并分析日志,接收方没有出现丢包问题,但是有接收码流不足,导致收包不及时,业务不流畅. 通过在系统内核发包udp_sendmsg函数打点,发现有时候有300ms+没有报文发出,说明发包线程被阻塞. 下面是监控组播出向发包函数udp_sendmsg的打点记录日

Linux 线程调度与优先级设置

转载:http://blog.csdn.net/a_ran/article/details/43759729 Linux内核的三种调度策略: 1,SCHED_OTHER 分时调度策略, 2,SCHED_FIFO实时调度策略,先到先服务.一旦占用cpu则一直运行.一直运行直到有更高优先级任务到达或自己放弃 3,SCHED_RR实时调度策略,时间片轮转.当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾.放在队列尾保证了所有具有相同优先级的RR任务的调度公平 Linux线程优先级设置   首

Linux 线程调度的优先级

Linux内核的三种调度策略: 1.SCHED_OTHER 分时调度策略 2.SCHED_FIFO实时调度策略,先到先服务.一旦占用cpu则一直运行.一直运行直到有更高优先级任务到达或自己放弃 3.SCHED_RR实时调度策略,时间片轮转.当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾.放在队列尾保证了所有具有相同优先级的RR任务的调度公平 Linux线程优先级设置: 首先,可以通过以下两个函数来获得线程可以设置的最高和最低优先级,函数中的策略即上述三种策略的宏定义: int sch

Linux 线程调度与优先级

Linux内核的三种调度策略 1,SCHED_OTHER:分时调度策略. 它是默认的线程分时调度策略,所有的线程的优先级别都是0,线程的调度是通过分时来完成的.简单地说,如果系统使用这种调度策略,程序将无法设置线程的优先级.请注意,这种调度策略也是抢占式的,当高优先级的线程准备运行的时候,当前线程将被抢占并进入等待队列.这种调度策略仅仅决定线程在可运行线程队列中的具有相同优先级的线程的运行次序. 2,SCHED_FIFO:实时调度策略,先到先服务.一旦占用cpu则一直运行.一直运行直到有更高优先

Linux 线程调度

1.线程sleep()后,会让出cpu的时间片,交由其他线程进行抢占cpu. 线程之间正常的切换是依靠时间片的. 当主线程没有结束,且其在所占有的时间片内,并没有结束自己的工作,此时,子线程将会抢占cpu时间片. 参考帖子以及下面的评论:https://blog.csdn.net/harry_lyc/article/details/6055734#reply 原文地址:https://www.cnblogs.com/xuelisheng/p/9277401.html

[转载]Linux 线程实现机制分析

本文转自http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 支持原创.尊重原创,分享知识! 自从多线程编程的概念出现在 Linux 中以来,Linux 多线应用的发展总是与两个问题脱不开干系:兼容性.效率.本文从线程模型入手,通过分析目前 Linux 平台上最流行的 LinuxThreads 线程库的实现及其不足,描述了 Linux 社区是如何看待和解决兼容性和效率这两个问题的. 一.基础知识:线程和进程 按照教科书上的定义,进

Linux下的编程实战【转】

一篇比较不错的文章, 降到了 makefile make , gcc编译器,GDB调试器, Linux文件系统,Linux文件API,.C语言库函数(C库函数的文件操作实际上是独立于具体的操作系统平台的),进程控制与进程通信编程 1.Linux进程 Linux进程在内存中包含三部分数据:代码段.堆栈段和数据段.代码段存放了程序的代码.代码段可以为机器中运行同一程序的数个 进程共享.堆栈段存放的是子程序(函数)的返回地址.子程序的参数及程序的局部变量.而数据段则存放程序的全局变量.常数以及动态数

Linux多线程实践(1) --线程理论

线程概念 在一个程序里的一个执行路线就叫做线程(thread).更准确的定义是:线程是"一个进程内部的控制序列/指令序列"; 一切进程至少有一个执行线程; 进程  VS. 线程  1.进程是资源分配(进程需要参与资源的竞争)的基本单位,而线程是处理器调度(程序执行)的最小单位; 2.线程共享进程数据,但也拥有自己的一部分(非常少O(∩_∩)O~)数据,如线程ID.程序计数器.一组寄存器.堆栈.errno(错误代码).信号状态.优先级等; 3.一个进程内部的线程可以共享资源,如代码段.数