对于实时调度策略,有的帖子说SCHED_FIFO和SCHED_RR可以任选一个,不能并存,这种说法对吗?
如果系统的实时调度策略可以任意设置为SCHED_FIFO和SCHED_RR中的一种,那么,当相同优先级进程的链表里面,是不是可以包含着两种策略的进程呢?或者这两种策略的进程是分开放的?
如果相同优先级的进程链表里面,可以包含这两种策略的进程,那么调用的时候如何选择呢?
13 个解决方案
#1
找个基础的书看看吧
#2
研究下linux源码吧,嘿嘿
#3
对于一个进程而言,他的调度政策当然只有一个。FIFO是先入先出的,只有他自己放弃或者更高优先级出现,他才会放弃CPU,而RR政策保证具有相同优先级的RR政策的进程之间时间片轮转。
至于Fifo遇到了RR会怎么样?我也不知道!!
至于Fifo遇到了RR会怎么样?我也不知道!!
#4
不是搞学术的,楼主这种问题我不会去研究,呵呵
对于系统是不是只能存在一种调度策略,没有研究过,不知道答案。
但是对于有明确竞争关系的进程必须只能有一种调度策略,这个不用研究,只要脑子想一下就知道。
举个例子,如果系统只有两个任务A和B,他们都要占用30s的cpu才能完成成,A任务比B任务先开始1S。
在队列中也就是A在B前面,如果是FIFO,A运行30S结束后才能开始B任务,这就不符合RR的调度了。
如果是RR,A,B任务交替运行1s,59s的时候A任务完成,60s的时候B任务完成,这就不是FIFO了。
你说有没有可能既是RR又是FIFO?
对于系统是不是只能存在一种调度策略,没有研究过,不知道答案。
但是对于有明确竞争关系的进程必须只能有一种调度策略,这个不用研究,只要脑子想一下就知道。
举个例子,如果系统只有两个任务A和B,他们都要占用30s的cpu才能完成成,A任务比B任务先开始1S。
在队列中也就是A在B前面,如果是FIFO,A运行30S结束后才能开始B任务,这就不符合RR的调度了。
如果是RR,A,B任务交替运行1s,59s的时候A任务完成,60s的时候B任务完成,这就不是FIFO了。
你说有没有可能既是RR又是FIFO?
#5
呵呵,我描述的有点不明确,对于同一个进程,当然只能是SCHED_FIFO、SCHED_RR、SCHED_NORMAL这3种策略中的一种。并且实时调度策略优先于非实时的调度策略。
在同一个优先级队列里面,可以存在FIFO和RR两种调度策略的进程吗?如果这两种调度策略可以同时存在,在选取运行的进程的时候如何取舍呢?时间片轮转和先进先出如何共存呢?
在同一个优先级队列里面,可以存在FIFO和RR两种调度策略的进程吗?如果这两种调度策略可以同时存在,在选取运行的进程的时候如何取舍呢?时间片轮转和先进先出如何共存呢?
#6
基本上,现在的书没有把这个讲解清楚的,估计要获取最权威的答案,只能看源码了,期望有大牛能够给解答一下~~
#7
#8
我的理解:
RT和FIFO的优先级定义是统一的,在调度时先运行高优先级的任务;如果这个任务是RT的,那就再带上时间片;如果是FIFO,就直到任务自己让出CPU或者阻塞。
比如说,任务A是FIFO 99,B是RT 98,C是FIFO 97,那么先调度A,再调度B(有时间片),最后调度C。
不过真的有必要混合RT和FIFO吗?
RT和FIFO的优先级定义是统一的,在调度时先运行高优先级的任务;如果这个任务是RT的,那就再带上时间片;如果是FIFO,就直到任务自己让出CPU或者阻塞。
比如说,任务A是FIFO 99,B是RT 98,C是FIFO 97,那么先调度A,再调度B(有时间片),最后调度C。
不过真的有必要混合RT和FIFO吗?
#9
我可以很负责人的说,可以共存。
低优先级的FIFO可以被高优先级的FIFO和RR抢占。
4楼说法明显有误,A和B优先级如果不同,肯定可以抢占,如果优先级相同,如果都是RR,那么交替运行,如果A是FIFO,B是RR,那么不能抢占,A运行完B运行,都是FIFO,也是不能抢占。
低优先级的FIFO可以被高优先级的FIFO和RR抢占。
4楼说法明显有误,A和B优先级如果不同,肯定可以抢占,如果优先级相同,如果都是RR,那么交替运行,如果A是FIFO,B是RR,那么不能抢占,A运行完B运行,都是FIFO,也是不能抢占。
#10
8楼说法也不对,明显连优先级概念都没搞清,明显C的优先级最高,咋可能最后调度C?
#11
还有很搞笑的一点是,如果有人先创建了一个实时的RR程序,那么后来人就不能在用FIFO了?那我在一个系统上运行新的进程的时候,还要先查查之前运行的进程有没有FIFO或者RR?大家动动脑子啊。
#12
Linux provides two real-time scheduling policies, SCHED_FIFO and SCHED_RR. The normal, not real-time scheduling policy is SCHED_NORMAL. SCHED_FIFO implements a simple first-in, first-out scheduling algorithm without timeslices. A runnable SCHED_FIFO task is always scheduled over any SCHED_NORMAL tasks. When a SCHED_FIFO task becomes runnable, it continues to run until it blocks or explicitly yields the processor; it has no timeslice and can run indefinitely. Only a higher priority SCHED_FIFO or SCHED_RR task can preempt a SCHED_FIFO task. Two or more SCHED_FIFO tasks at the same priority run round robin, but again only yielding the processor when they explicitly choose to do so. If a SCHED_FIFO task is runnable, all tasks at a lower priority cannot run until it finishes.
SCHED_RR is identical to SCHED_FIFO except that each process can run only until it exhausts a predetermined timeslice. That is, SCHED_RR is SCHED_FIFO with timeslicesit is a real-time round-robin scheduling algorithm. When a SCHED_RR task exhausts its timeslice, any other real-time processes at its priority are scheduled round robin. The timeslice is used only to allow rescheduling of same-priority processes. As with SCHED_FIFO, a higher-priority process always immediately preempts a lower-priority one, and a lower-priority process can never preempt a SCHED_RR task, even if its timeslice is exhausted.
SCHED_RR is identical to SCHED_FIFO except that each process can run only until it exhausts a predetermined timeslice. That is, SCHED_RR is SCHED_FIFO with timeslicesit is a real-time round-robin scheduling algorithm. When a SCHED_RR task exhausts its timeslice, any other real-time processes at its priority are scheduled round robin. The timeslice is used only to allow rescheduling of same-priority processes. As with SCHED_FIFO, a higher-priority process always immediately preempts a lower-priority one, and a lower-priority process can never preempt a SCHED_RR task, even if its timeslice is exhausted.
#13
版主正解,楼上出处《Linux内核设计与实现》
#1
找个基础的书看看吧
#2
研究下linux源码吧,嘿嘿
#3
对于一个进程而言,他的调度政策当然只有一个。FIFO是先入先出的,只有他自己放弃或者更高优先级出现,他才会放弃CPU,而RR政策保证具有相同优先级的RR政策的进程之间时间片轮转。
至于Fifo遇到了RR会怎么样?我也不知道!!
至于Fifo遇到了RR会怎么样?我也不知道!!
#4
不是搞学术的,楼主这种问题我不会去研究,呵呵
对于系统是不是只能存在一种调度策略,没有研究过,不知道答案。
但是对于有明确竞争关系的进程必须只能有一种调度策略,这个不用研究,只要脑子想一下就知道。
举个例子,如果系统只有两个任务A和B,他们都要占用30s的cpu才能完成成,A任务比B任务先开始1S。
在队列中也就是A在B前面,如果是FIFO,A运行30S结束后才能开始B任务,这就不符合RR的调度了。
如果是RR,A,B任务交替运行1s,59s的时候A任务完成,60s的时候B任务完成,这就不是FIFO了。
你说有没有可能既是RR又是FIFO?
对于系统是不是只能存在一种调度策略,没有研究过,不知道答案。
但是对于有明确竞争关系的进程必须只能有一种调度策略,这个不用研究,只要脑子想一下就知道。
举个例子,如果系统只有两个任务A和B,他们都要占用30s的cpu才能完成成,A任务比B任务先开始1S。
在队列中也就是A在B前面,如果是FIFO,A运行30S结束后才能开始B任务,这就不符合RR的调度了。
如果是RR,A,B任务交替运行1s,59s的时候A任务完成,60s的时候B任务完成,这就不是FIFO了。
你说有没有可能既是RR又是FIFO?
#5
呵呵,我描述的有点不明确,对于同一个进程,当然只能是SCHED_FIFO、SCHED_RR、SCHED_NORMAL这3种策略中的一种。并且实时调度策略优先于非实时的调度策略。
在同一个优先级队列里面,可以存在FIFO和RR两种调度策略的进程吗?如果这两种调度策略可以同时存在,在选取运行的进程的时候如何取舍呢?时间片轮转和先进先出如何共存呢?
在同一个优先级队列里面,可以存在FIFO和RR两种调度策略的进程吗?如果这两种调度策略可以同时存在,在选取运行的进程的时候如何取舍呢?时间片轮转和先进先出如何共存呢?
#6
基本上,现在的书没有把这个讲解清楚的,估计要获取最权威的答案,只能看源码了,期望有大牛能够给解答一下~~
#7
#8
我的理解:
RT和FIFO的优先级定义是统一的,在调度时先运行高优先级的任务;如果这个任务是RT的,那就再带上时间片;如果是FIFO,就直到任务自己让出CPU或者阻塞。
比如说,任务A是FIFO 99,B是RT 98,C是FIFO 97,那么先调度A,再调度B(有时间片),最后调度C。
不过真的有必要混合RT和FIFO吗?
RT和FIFO的优先级定义是统一的,在调度时先运行高优先级的任务;如果这个任务是RT的,那就再带上时间片;如果是FIFO,就直到任务自己让出CPU或者阻塞。
比如说,任务A是FIFO 99,B是RT 98,C是FIFO 97,那么先调度A,再调度B(有时间片),最后调度C。
不过真的有必要混合RT和FIFO吗?
#9
我可以很负责人的说,可以共存。
低优先级的FIFO可以被高优先级的FIFO和RR抢占。
4楼说法明显有误,A和B优先级如果不同,肯定可以抢占,如果优先级相同,如果都是RR,那么交替运行,如果A是FIFO,B是RR,那么不能抢占,A运行完B运行,都是FIFO,也是不能抢占。
低优先级的FIFO可以被高优先级的FIFO和RR抢占。
4楼说法明显有误,A和B优先级如果不同,肯定可以抢占,如果优先级相同,如果都是RR,那么交替运行,如果A是FIFO,B是RR,那么不能抢占,A运行完B运行,都是FIFO,也是不能抢占。
#10
8楼说法也不对,明显连优先级概念都没搞清,明显C的优先级最高,咋可能最后调度C?
#11
还有很搞笑的一点是,如果有人先创建了一个实时的RR程序,那么后来人就不能在用FIFO了?那我在一个系统上运行新的进程的时候,还要先查查之前运行的进程有没有FIFO或者RR?大家动动脑子啊。
#12
Linux provides two real-time scheduling policies, SCHED_FIFO and SCHED_RR. The normal, not real-time scheduling policy is SCHED_NORMAL. SCHED_FIFO implements a simple first-in, first-out scheduling algorithm without timeslices. A runnable SCHED_FIFO task is always scheduled over any SCHED_NORMAL tasks. When a SCHED_FIFO task becomes runnable, it continues to run until it blocks or explicitly yields the processor; it has no timeslice and can run indefinitely. Only a higher priority SCHED_FIFO or SCHED_RR task can preempt a SCHED_FIFO task. Two or more SCHED_FIFO tasks at the same priority run round robin, but again only yielding the processor when they explicitly choose to do so. If a SCHED_FIFO task is runnable, all tasks at a lower priority cannot run until it finishes.
SCHED_RR is identical to SCHED_FIFO except that each process can run only until it exhausts a predetermined timeslice. That is, SCHED_RR is SCHED_FIFO with timeslicesit is a real-time round-robin scheduling algorithm. When a SCHED_RR task exhausts its timeslice, any other real-time processes at its priority are scheduled round robin. The timeslice is used only to allow rescheduling of same-priority processes. As with SCHED_FIFO, a higher-priority process always immediately preempts a lower-priority one, and a lower-priority process can never preempt a SCHED_RR task, even if its timeslice is exhausted.
SCHED_RR is identical to SCHED_FIFO except that each process can run only until it exhausts a predetermined timeslice. That is, SCHED_RR is SCHED_FIFO with timeslicesit is a real-time round-robin scheduling algorithm. When a SCHED_RR task exhausts its timeslice, any other real-time processes at its priority are scheduled round robin. The timeslice is used only to allow rescheduling of same-priority processes. As with SCHED_FIFO, a higher-priority process always immediately preempts a lower-priority one, and a lower-priority process can never preempt a SCHED_RR task, even if its timeslice is exhausted.
#13
版主正解,楼上出处《Linux内核设计与实现》