线程调度策略SCHED_RR(轮转法)和SCHED_FIFO(先进先出)之对照

我们在用pthread创建线程时,能够指定调度策略policy——SCHED_OTHER(默认)、SCHED_RR和SCHED_FIFO。这里TALK一下两个实时策略——SCHED_RR和SCHED_FIFO。

先看一下效果。我们创建了四个子线程,指定最高优先级(针对特定策略):

  • SCHED_RR

  • SCHED_FIFO

对同样优先级的任务。SCHED_RR是分配给每一个任务一个特定的时间片,然后轮转依次运行。而SCHED_FIFO则是让一个任务运行完再调度下一个任务,而顺序就是依照创建的先后。

SCHED_RR是依据时间片来调度线程的,当时间片用完时,无论这个线程优先级有多高,都不会在执行,而是进入就绪队列,等待下一个时间片到来。只是图1显示,在thread5798时间片用完时,该线程紧接着进行了一次抢占preemption。又获得了一个时间片。顺便提一句时间片长度的定位是linux凭经验来的。即选择尽可能长、同一时候能保持良好对应时间的一个时间片。

时间: 2024-10-25 09:36:29

线程调度策略SCHED_RR(轮转法)和SCHED_FIFO(先进先出)之对照的相关文章

linux线程调度策略

目录 linux线程调度策略 linux线程调度策略 这是一篇关于线程调度的非常好的资料,翻译自shed 从Linux 2.6.23开始,默认的调度器为CFS,即"完全公平调度器"(Completely Fair Scheduler).CFS调度器取代了之前的"O(1)"调度器. Scheduling policies 内核模块使用调度器来决定下一个CPU时钟周期执行的线程.每个线程都包含一个调度策略以及一个静态的调度优先级sched_priority,调度器根据系

一种线程调度策略【线程需要的时候运行,不需要的时候暂停】

1.背景 比如注册用户的时候需要发送邮件,但是发送邮件有一定的延时,所以注册的时候是发邮件的同时,返回注册成功给用户,而发邮件则由发邮件线程处理?如何处理发邮件的线程呢?我目前想到的有:1.每次需要运行时临时创建线程:2.线程每次执行完毕后自行Sleep一定的时间,等待结束后检查是否有需要运行的必要,否则进入Sleep.第一个方法由于每次都要起一个线程,然后又关掉线程,反反复复不好,而且还有其他隐患.第二种呢,只创建一次线程,但是由于有一个Sleep过程,所以发邮件有一定的延时,也不是太好.我目

linux进程/线程调度策略(SCHED_OTHER,SCHED_FIFO,SCHED_RR)

linux内核的三种 调度策略 : SCHED_OTHER 分时调度策略,(默认的) SCHED_FIFO实时调度策略,先到先服务 SCHED_RR实时调度策略,时间片轮转 实时进程将得到优先调用,实时进程根据实时优先级决定调度权值,分时进程则通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了cpu最少的进程将会得到优先调度. SHCED_RR和SCHED_FIFO的不同: 当采用SHCED_RR策略的进程的时间片用完,系统将重新分配时间

一个线程调度策略的例子

创建线程:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg); 接下来要说的是:创建线程后,设置线程优先级的问题. 获取/设置当前线程使用的调度策略:函数: int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy); int pthread_att

一种线程调度策略【线程须要的时候执行,不须要的时候暂停】

1.背景 比方注冊用户的时候须要发送邮件,可是发送邮件有一定的延时,所以注冊的时候是发邮件的同一时候,返回注冊成功给用户.而发邮件则由发邮件线程处理?怎样处理发邮件的线程呢?我眼下想到的有:1.每次须要执行时暂时创建线程:2.线程每次执行完成后自行Sleep一定的时间.等待结束后检查是否有须要执行的必要.否则进入Sleep.第一个方法因为每次都要起一个线程,然后又关掉线程.反重复复不好,并且还有其它隐患.另外一种呢,仅仅创建一次线程,可是因为有一个Sleep过程,所以发邮件有一定的延时.也不是太

Linux的POSIX线程属性

创建POSIX线程的函数为 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 第1个参数为线程句柄(类似于文件描述符),第3个参数为线程启动函数(输入void*.返回void*,因为指向任何结构体/基本数据类型的指针都可以被看作void*,而void*一般都可以显式强制转换成指向对应类型的指针甚至整型,这是不支持纯C编程的常见

UNIX环境编程学习笔记(27)——多线程编程(二):控制线程属性

lienhua342014-11-09 1 线程属性概括 POSIX 线程的主要属性包括 scope 属性.detach 属性.堆栈地址.堆栈大小.优先级.在头文件 pthread.h 中定义了结构体pthread_attr_t 来记录线程的属性. 在创建线程的函数pthread_create 的第二个参数 attr 就是一个pthread_attr_t结构体的指针,通过该参数,我们可以控制新创建的线程的属性.如果 atrr参数为 NULL,表示创建一个默认属性的新线程. pthread_att

Linux进程调度策略

linux内核的三种主要调度策略: 1,SCHED_OTHER 分时调度策略, 2,SCHED_FIFO实时调度策略(先到先服务)3,SCHED_RR实时调度策略(时间片轮转) 实时进程将得到优先调用,实时进程根据实时优先级决定调度权值. 分时进程则通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了cpu最少的进程将会得到优先调度. 任一个执行时间超过10ms或前两个执行时间超过10ms都会导致运行结果出现偏差,因为 cpu 的调度周期为

用户线程和内核线程的区别

1 .内核级线程:切换由内核控制,当线程进行切换的时候,由用户态转化为内核态.切换完毕要从内核态返回用户态:可以很好的利用smp,即利用多核cpu.windows线程就是这样的. 2. 用户级线程内核的切换由用户态程序自己控制内核切换,不需要内核干涉,少了进出内核态的消耗,但不能很好的利用多核Cpu,目前Linux pthread大体是这么做的. 线 程的实现可以分为两类:用户级线程(User-Level Thread)和内核线线程(Kernel-Level Thread),后者又称为内核支持的