NAME

     sched_setscheduler,  sched_getscheduler  -   set   and   get
     scheduling algorithm/parameters


SYNOPSIS

     #include <sched.h>

     int sched_setscheduler(pid_t pid, int policy,  const  struct
     sched_param *p);

     int sched_getscheduler(pid_t pid));

     struct sched_param {
         ...
         int sched_priority;
         ...
     };


DESCRIPTION

     sched_setscheduler sets both the scheduling policy  and  the
     associated  parameters for the process identified by pid. If
     pid equals zero, the scheduler of the calling  process  will
     be set. The interpretation of the parameter p depends on the
     selected policy. Currently, the following  three  scheduling
     policies  are  supported under Linux:  SCHED_FIFO, SCHED_RR,
     and SCHED_OTHER; their  respective  semantics  is  described
     below.

     sched_getscheduler queries the scheduling  policy  currently
     applied  to  the  process  identified  by pid. If pid equals
     zero, the policy of the calling process will be retrieved.



  Scheduling Policies
     The scheduler is the kernel part that decides which runnable
     process  will  be  executed  by  the  CPU  next.  The  Linux
     scheduler offers three different  scheduling  policies,  one
     for  normal  processes and two for real-time applications. A
     static priority value sched_priority  is  assigned  to  each
     process and this value can be changed only via system calls.
     Conceptually, the scheduler maintains  a  list  of  runnable
     processes   for  each  possible  sched_priority  value,  and
     sched_priority can have a value in the range  0  to  99.  In
     order  to  determine  the  process that runs next, the Linux
     scheduler looks for the  non-empty  list  with  the  highest
     static  priority  and  takes the process at the head of this
     list. The scheduling policy  determines  for  each  process,
     where  it  will  be inserted into the list of processes with
     equal static priority and how it will move inside this list.

     SCHED_OTHER is the default universal time-sharing  scheduler
     policy  used  by most processes, SCHED_FIFO and SCHED_RR are
     intended for special time-critical  applications  that  need
     precise control over the way in which runnable processes are
     selected for execution. Processes scheduled with SCHED_OTHER
     must  be assigned the static priority 0, processes scheduled
     under SCHED_FIFO or SCHED_RR can have a static  priority  in
     the  range 1 to 99. Only processes with superuser privileges
     can get a static priority higher than 0 and can therefore be
     scheduled  under  SCHED_FIFO  or  SCHED_RR. The system calls
     sched_get_priority_min  and  sched_get_priority_max  can  be
     used  to to find out the valid priority range for a schedul-
     ing policy in a portable way on all POSIX.1b conforming sys-
     tems.

     All scheduling is preemptive: If a  process  with  a  higher
     static  priority gets ready to run, the current process will
     be preempted and returned into its wait list. The scheduling
     policy only determines the ordering within the list of runn-
     able processes with equal static priority.


  SCHED_FIFO: First In-First out scheduling
     SCHED_FIFO can only be used with  static  priorities  higher
     than  0, that means that when a SCHED_FIFO processes becomes
     runnable, it will always preempt immediately  any  currently
     running  normal  SCHED_OTHER process. SCHED_FIFO is a simple
     scheduling algorithm without  time  slicing.  For  processes
     scheduled  under  the SCHED_FIFO policy, the following rules
     are applied: A SCHED_FIFO process that has been preempted by
     another  process of higher priority will stay at the head of
     the list for its priority and will resume execution as  soon
     as  all processes of higher priority are blocked again. When
     a SCHED_FIFO process becomes runnable, it will  be  inserted
     at  the  end  of  the  list  for  its  priority.  A  call to
     sched_setscheduler or sched_setparam will put the SCHED_FIFO
     process  identified  by pid at the end of the list if it was
     runnable. A process calling sched_yield will be put  at  the
     end  of  the  list.  No  other  events  will  move a process
     scheduled under the SCHED_FIFO policy in the  wait  list  of
     runnable  processes with equal static priority. 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.



  SCHED_RR: Round Robin scheduling
     SCHED_RR is a simple enhancement of  SCHED_FIFO.  Everything
     described  above  for  SCHED_FIFO  also applies to SCHED_RR,
     except that each process is only allowed to run for  a  max-
     imum  time  quantum.  If a SCHED_RR process has been running
     for a time period equal to or longer than the time  quantum,
     it  will  be  put at the end of the list for its priority. A
     SCHED_RR process that has been preempted by a higher  prior-
     ity  process and subsequently resumes execution as a running
     process will complete the unexpired  portion  of  its  round
     robin  time  quantum.  The length of the time quantum can be
     retrieved by sched_rr_get_interval.


  SCHED_OTHER: Default Linux time-sharing scheduling
     SCHED_OTHER  can  only  be  used  at  static   priority   0.
     SCHED_OTHER  is  the  standard  Linux time-sharing scheduler
     that is intended for all processes that do not require  spe-
     cial  static  priority  real-time mechanisms. The process to
     run is chosen from the static priority 0  list  based  on  a
     dynamic  priority  that is determined only inside this list.
     The dynamic priority is based on the nice level (set by  the
     nice or setpriority system call) and increased for each time
     quantum the process is ready to run, but denied  to  run  by
     the   scheduler.   This  ensures  fair  progress  among  all
     SCHED_OTHER processes.


  Response time
     A blocked high priority process waiting for the  I/O  has  a
     certain response time before it is scheduled again. The dev-
     ice driver writer can greatly reduce this response  time  by
     using  a  "slow interrupt" interrupt handler as described in
     request_irq(9).


  Miscellaneous
     Child processes inherit the scheduling algorithm and parame-
     ters across a fork.

     Memory locking is usually needed for real-time processes  to
     avoid  paging  delays, this can be done with mlock or mlock-
     all.

     As a non-blocking end-less loop in a process scheduled under
     SCHED_FIFO  or  SCHED_RR will block all processes with lower
     priority forever, a software developer  should  always  keep
     available  on  the  console a shell scheduled under a higher
     static priority than the tested application. This will allow
     an  emergency  kill of tested real-time applications that do
     not block  or  terminate  as  expected.  As  SCHED_FIFO  and
     SCHED_RR processes can preempt other processes forever, only
     root processes are allowed to activate these policies  under
     Linux.

     POSIX    systems    on    which    sched_setscheduler    and
     sched_getscheduler        are        available        define
     _POSIX_PRIORITY_SCHEDULING in <unistd.h>.


RETURN VALUE

     On success, sched_setscheduler  returns  zero.  On  success,
     sched_getscheduler  returns  the  policy  for the process (a
     non-negative integer). On error, -1 is  returned,  errno  is
     set appropriately.


ERRORS

     ESRCH   The process whose ID is pid could not be found.

     EPERM   The  calling  process  does  not  have   appropriate
             privileges.  Only  root  processes  are  allowed  to
             activate the SCHED_FIFO and SCHED_RR  policies.  The
             process  calling  sched_setscheduler needs an effec-
             tive uid equal to the euid or  uid  of  the  process
             identified  by  pid,  or it must be a superuser pro-
             cess.

     EINVAL  The scheduling policy is not one of  the  recognized
             policies, or the parameter p does not make sense for
             the policy.


CONFORMING TO

     POSIX.1b (formerly POSIX.4)


BUGS

     As of linux-1.3.81, SCHED_RR has not yet been  tested  care-
     fully  and might not behave exactly as described or required
     by POSIX.1b.


SEE ALSO

     sched_setparam(2),    sched_getparam(2),     sched_yield(2),
     sched_get_priority_max(2),        sched_get_priority_min(2),
     nice(2), setpriority(2), getpriority(2),  mlockall(2),  mun-
     lockall(2), mlock(2), munlock(2).

     Programming for the real world -  by  Bill  O.  Gallmeister,
     O'Reilly & Associates, Inc., ISBN 1-56592-074-0
     IEEE Std 1003.1b-1993 (POSIX.1b standard)
     ISO/IEC 9945-1:1996 - This  is  the  new  1996  revision  of
     POSIX.1 which contains in one single standard POSIX.1(1990),
     POSIX.1b(1993), POSIX.1c(1995), and POSIX.1i(1995).