关于SCHED_FIFO和SCHED_RR的疑惑,谢谢解答:)

wuliming_sc 2011-07-08 04:30:17
linux提供了两种实时调度策略:SCHED_FIFO和SCHED_RR,实时调度策略比任何SCHED_NORMAL的进程都优先得到调度。
对于实时调度策略,有的帖子说SCHED_FIFO和SCHED_RR可以任选一个,不能并存,这种说法对吗?
如果系统的实时调度策略可以任意设置为SCHED_FIFO和SCHED_RR中的一种,那么,当相同优先级进程的链表里面,是不是可以包含着两种策略的进程呢?或者这两种策略的进程是分开放的?
如果相同优先级的进程链表里面,可以包含这两种策略的进程,那么调用的时候如何选择呢?
...全文
1267 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
nanguapanpan 2013-01-29
  • 打赏
  • 举报
回复
版主正解,楼上出处《Linux内核设计与实现》
nevil 2013-01-29
  • 打赏
  • 举报
回复
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.
nanguapanpan 2013-01-29
  • 打赏
  • 举报
回复
还有很搞笑的一点是,如果有人先创建了一个实时的RR程序,那么后来人就不能在用FIFO了?那我在一个系统上运行新的进程的时候,还要先查查之前运行的进程有没有FIFO或者RR?大家动动脑子啊。
nanguapanpan 2013-01-29
  • 打赏
  • 举报
回复
8楼说法也不对,明显连优先级概念都没搞清,明显C的优先级最高,咋可能最后调度C?
nanguapanpan 2013-01-29
  • 打赏
  • 举报
回复
我可以很负责人的说,可以共存。 低优先级的FIFO可以被高优先级的FIFO和RR抢占。 4楼说法明显有误,A和B优先级如果不同,肯定可以抢占,如果优先级相同,如果都是RR,那么交替运行,如果A是FIFO,B是RR,那么不能抢占,A运行完B运行,都是FIFO,也是不能抢占。
zerosp 2012-08-20
  • 打赏
  • 举报
回复
我的理解:
RT和FIFO的优先级定义是统一的,在调度时先运行高优先级的任务;如果这个任务是RT的,那就再带上时间片;如果是FIFO,就直到任务自己让出CPU或者阻塞。
比如说,任务A是FIFO 99,B是RT 98,C是FIFO 97,那么先调度A,再调度B(有时间片),最后调度C。

不过真的有必要混合RT和FIFO吗?
wuliming_sc 2011-07-21
  • 打赏
  • 举报
回复
基本上,现在的书没有把这个讲解清楚的,估计要获取最权威的答案,只能看源码了,期望有大牛能够给解答一下~~
wuliming_sc 2011-07-21
  • 打赏
  • 举报
回复
呵呵,我描述的有点不明确,对于同一个进程,当然只能是SCHED_FIFO、SCHED_RR、SCHED_NORMAL这3种策略中的一种。并且实时调度策略优先于非实时的调度策略。
在同一个优先级队列里面,可以存在FIFO和RR两种调度策略的进程吗?如果这两种调度策略可以同时存在,在选取运行的进程的时候如何取舍呢?时间片轮转和先进先出如何共存呢?
wyjq395 2011-07-15
  • 打赏
  • 举报
回复
不是搞学术的,楼主这种问题我不会去研究,呵呵
对于系统是不是只能存在一种调度策略,没有研究过,不知道答案。
但是对于有明确竞争关系的进程必须只能有一种调度策略,这个不用研究,只要脑子想一下就知道。
举个例子,如果系统只有两个任务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?
dongjiawei316 2011-07-13
  • 打赏
  • 举报
回复
对于一个进程而言,他的调度政策当然只有一个。FIFO是先入先出的,只有他自己放弃或者更高优先级出现,他才会放弃CPU,而RR政策保证具有相同优先级的RR政策的进程之间时间片轮转。
至于Fifo遇到了RR会怎么样?我也不知道!!
louyong0571 2011-07-12
  • 打赏
  • 举报
回复
研究下linux源码吧,嘿嘿
zonewone 2011-07-11
  • 打赏
  • 举报
回复
找个基础的书看看吧
[Quote=引用楼主 wuliming_sc 的回复:]
linux提供了两种实时调度策略:SCHED_FIFO和SCHED_RR,实时调度策略比任何SCHED_NORMAL的进程都优先得到调度。
对于实时调度策略,有的帖子说SCHED_FIFO和SCHED_RR可以任选一个,不能并存,这种说法对吗?
如果系统的实时调度策略可以任意设置为SCHED_FIFO和SCHED_RR中的一种,那么,当相同优先级进程的链表里面,是不是可以包含着两种策略的进程呢……
[/Quote]
多线程与智能指针 C++线程与智能指针 ⽂章⽬录 线程 线程,有时被称为轻量进程,是程序执⾏的最⼩单元。 C++11线程 #include void task(int i) { cout << "task:" << i << endl; } thread t1(task,100); //等待线程结束再继续执⾏ t1.join(); POSIX线程 POSIX 可移植操作系统接⼝,标准定义了操作系统应该为应⽤程序提供的接⼝标准 Windows上使⽤ 配置: cmake_minimum_required (VERSION 3.8) include_directories("XXX/pthreads-w32-2-9-1-release/Pre-built.2/include") #设置变量为x64 or x86 if(CMAKE_CL_64) set(platform x64) else() set(platform x86) endif() link_directories("XXX/pthreads-w32-2-9-1-release/Pre-built.2/lib/${platform}") #如果出现 "timespec":"struct" 类型重定义 设置 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_STRUCT_TIMESPEC") # 将源添加到此项⽬的可执⾏⽂件。 add_executable (lsn6example "lsn6_example.cpp" "lsn6_example.h") target_link_libraries(lsn6example pthreadVC2) 32位拷贝pthreadVC2.dll 到windows/syswow64⽬录 64位拷贝pthreadVC2.dll 到windows/system32⽬录 #include void *pthreadTask(void* args) { int* i = static_cast(args); cout << "posix线程:" << *i << endl; return 0; } pthread_t pid; int pi = 100; pthread_create(&pid, 0, pthreadTask, &pi); //等待线程的结束 pthread_join(pid,0); 线程属性 线程具有属性,⽤ pthread_attr_t 表⽰ pthread_attr_t attr; //初始化 attr中为操作系统实现⽀持的线程所有属性的默认值 pthread_attr_init(&attr); pthread_attr_destroy(&attr); 分离线程 线程创建默认是⾮分离的,当pthread_join()函数返回时,创建的线程终⽌,释放⾃⼰占⽤的系统资源 分离线程不能被其他线程等待,pthread_join⽆效,线程⾃⼰玩⾃⼰的。 //设置是否为分离线程 //PTHREAD_CREATE_DETACHED 分离 //PTHREAD_CREATE_JOINABLE ⾮分离 pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); 调度策略与优先级 Windows ⽆法设置成功 //设置调度策略 //返回0 设置成功 pthread_attr_setschedpolicy(&attr, SCHED_FIFO); // SCHED_FIFO // 实时调度策略,先到先服务 ⼀旦占⽤cpu则⼀直运⾏。⼀直运⾏直到有更⾼优先级任务到达或⾃⼰放弃。 // SCHED_RR // 实时调度策略,时间轮转 系统分配⼀个时间段,在时间段内执⾏本线程 //设置优先级 //获得对应策略的最⼩、最⼤优先级 int max = sched_get_priority_max(SCHED_FIFO); int min = sched_get_priority_min(SCHED_FIFO); sched_param param; param.sched_priority = max; pthread_attr_setschedparam(&attr, ¶m); 线程同步 多线程同时读写同⼀份共享资源的时候,可能会引起冲突。需要引⼊线程"同步"机制,即各位线程之间有序地对共享资源进⾏操 作。 #include using namespace std; queue q; void *pop(void* args) { //线程未同步导致的多线程安

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧