Linux SCHED_OTHER, SCHED_FIFO and SCHED_RR - differences
SCHED_FIFO and SCHED_RR are so called "real-time" policies. They implement the fixed-priority real-time scheduling specified by the POSIX standard. Tasks with these policies preempt every other task, which can thus easily go into starvation (if they don't release the CPU).
The difference between SCHED_FIFO and SCHED_RR is that among tasks with the same priority, SCHED_RR performs a round-robin with a certain timeslice; SCHED_FIFO, instead, needs the task to explicitly yield the processor.
SCHED_OTHER is the common round-robin time-sharing scheduling policy that schedules a task for a certain timeslice depending on the other tasks running in the system.
Update: since Linux 3.14, there is an additional policy called SCHED_DEADLINE. This policy implements the Constant Bandwidth Server (CBS) algorithm on top of Earliest Deadline First queues. Each task under this policy is assigned a deadline, and the earliest-deadline task is executed. The best resource describing this algorithm is Deadline scheduling in the Linux kernel.
Update 2: since Linux 4.13, SCHED_DEADLINE has replaced CBS with the Greedy Reclamation of Unused Bandwidth (GRUB) algorithm.
How does SCHED_FIFO and SCHED_RR interfer with each other?
Conceptually, there is a list of runnable processes associated with each static priority level. These lists can contain both SCHED_FIFO
and SCHED_RR
processes - the two scheduling policies share the same set of static priorities.
When selecting a process to run, the scheduler takes the process at the head of the non-empty list with the highest static priority, regardless of the scheduling policy of that process.
The scheduling policies affect how the processes move within those lists. For SCHED_FIFO
, once a process reaches the head of the list for a given priority it will stay there until it blocks or yields. For SCHED_RR
, a runnable process that has exceeded its maximum time quantum will be moved to the end of the list for its static priority.
On Linux SCHED_FIFO and SCHED_RR
The infamous pchdtvr
program, which captures digital TV signals, uses SCHED_FIFO
to make sure that the TV packets are written to disk no matter what. It can capture 4 shows at once while playing Doom on an old computer.
The program is infamous because it was released under GPL and the author tried to revoke the GPL retroactively. This act provoked a minor firestorm. Anyway, you can find a recent version to study at http://frequal.com/pmn/pchdtvr.html.
Linux SCHED_OTHER (CFS) User Time vs. SCHED_RR and SCHED_FIFO User Time
It is conceivable that CPU-bound SCHED_FIFO
real-time processes don't give other processes a chance to initiate an asynchronous read. Whereas with SCHED_OTHER
more processes initiate asynchronous reads thus spending less total time waiting for data.
Practical use of Linux real time scheduling priorities (SCHED_FIFO and SCHED_RR)?
sched_setscheduler
sets the scheduler of the process, not the thread. See:
http://pubs.opengroup.org/onlinepubs/9699919799/functions/sched_setscheduler.html
If you want to set the scheduler for a thread, you need to use the pthread_attr_setschedpolicy
and pthread_attr_setschedparam
functions on the attribute object for the new thread before you create it.
I'm not sure how conformant Linux is on honoring these requirements, but you should at least start out by making sure your code is correct to the specification, then adjust it as needed...
Scheduling policies in Linux Kernel
Yes, Linux supports no less then 4 different scheduling methods for tasks: SCHED_BATCH, SCHED_FAIR, SCHED_FIFO and SCHED_RR.
Regardless of scheduling method, all tasks also have a fixed hard priority (which is 0 for batch and fair and from 1- 99 for the RT schedulign methods of FIFO and RR). Tasks are first and foremost picked by priority - the highest priority wins.
However, with several tasks available for running with the same priority, that is where the scheduling method kicks in: A fair task will only run for its allotted weighted (with the weight coming from a soft priority called the task nice level) share of the CPU time with regard to other fair tasks, a FIFO task will run for a fixed time slice before yielding to another task (of the same priority - higher priority tasks always wins) and RR tasks will run till it blocks disregarding other tasks with the same priority.
Please note what I wrote above is accurate but not complete, because it does not take into account advance CPU reservation features, but it give the details about different scheduling method interact with each other.
Related Topics
Svn Error: Can't Convert String from Native Encoding to 'Utf-8'
Linux Process in Background - "Stopped" in Jobs
Move Files to Directories Based on Extension
Examining C/C++ Heap Memory Statistics in Gdb
Truncating the First 100Mb of a File in Linux
Where to Start Learning About Linux Dma/Device Drivers/Memory Allocation
Ocr - Getting Text from Image Using Tesseract 3.0 and Imagemagick 6.6.5
Multiple Ble Connections Using Linux and Bluez 5.0
Recursively Kill R Process with Children in Linux
Icmp Request Received, But Doesn't Reply
Add Margin to PDF File When Merging Using Pdftk or Similar
Ld_Library_Path Doesn't Seem to Work
How to Use Iptables in Linux to Forward Http and Https Traffic to a Transparent Proxy
Profiling a (Possibly I/O-Bound) Process to Reduce Latency
How to Find Files That Only Have Certain Permission for Owner