Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SCHED_FIFO process with priority of 99 gets preempted?

this is from sched_setscheduler(2) - Linux man page:

"Processes scheduled under one of the real-time policies (SCHED_FIFO, SCHED_RR) have a sched_priority value in the range 1 (low) to 99 (high)."

"A SCHED_FIFO process runs until either it is blocked by an I/O request, it is preempted by a higher priority process, or it calls sched_yield(2)."

I have the following code:

struct sched_param sp;
memset( &sp, 0, sizeof(sp) );
sp.sched_priority = 99;
sched_setscheduler( 0, SCHED_FIFO, &sp );

Now the process should be running under the highest possible priority (99) and should never be preempted.

So, when it starts running the following loop:

while ( 1 ) ;

it should be running forever and no other process should be allowed to run.

In spite of this, when I start such a process, I can use other processes too. Other processes run much slower, but they DO run.

My processor has 2 cores, so I started two copies of the process. Usage of both cores jumped to 97%-100%. Both processes were running their infinite loop.

I could still type commands in a shell and watch their output. I could use GUI programs as well.

How's that possible since a SCHED_FIFO process with a priority of 99 should never be preempted?

like image 574
Piotr S Avatar asked Dec 21 '13 19:12

Piotr S


People also ask

What is Sched_fifo?

SCHED_FIFO is a queue-based scheduler with different queues for each priority level. SCHED_RR is like FIFO except that each thread has an execution time quota. Both SCHED_FIFO and SCHED_RR are POSIX Realtime extensions. SCHED_OTHER is the default scheduling policy.

Which of the following is the range of priorities of real time processes in Linux?

In Linux system priorities are 0 to 139 in which 0 to 99 for real-time and 100 to 139 for users. Nice value — Nice values are user-space values that we can use to control the priority of a process. The nice value range is -20 to +19 where -20 is highest, 0 default and +19 is lowest.

What is Sched_normal?

SCHED_OTHER or SCHED_NORMAL is the default scheduling policy for Linux threads. It has a dynamic priority that is changed by the system based on the characteristics of the thread. Another thing that effects the priority of SCHED_OTHER threads is their nice value.

How do I change scheduling policy in Linux?

Change Scheduling Policy “SCHED_FIFO” with Priority To change the scheduling policy of a process and set its priority level, execute the below-mentioned option with the chart command. For example, the current schedule of the program is “Sched_Batch” and we want to change it to “Sched_Fifo”.


1 Answers

If you haven't changed any other policy settings, then you're likely getting throttled. See this informative article on the real-time limits added to the scheduler a few years back.

The gist of it is: Unprivileged users can use SCHED_FIFO and try to soak the CPU, but the RT limits code will force a little bit of SCHED_OTHER in anyway so you don't wedge the system. From the article:

Kernels shipped since 2.6.25 have set the rt_bandwidth value for the default group to be 0.95 out of every 1.0 seconds. In other words, the group scheduler is configured, by default, to reserve 5% of the CPU for non-SCHED_FIFO tasks.

like image 65
Joe Z Avatar answered Nov 15 '22 18:11

Joe Z