Chapter 37. Setting the priority for a process with library calls
You can set the priority for a process using the chrt
utility.
Prerequisites
- You have administrator privileges.
37.1. Library calls for setting priority
Real-time processes use a different set of library calls to control policy and priority. The following library calls are used to set the priority of non-real-time processes.
-
nice
-
setpriority
These functions adjust the nice value of a non-real-time process. The nice
value serves as a suggestion to the scheduler on how to order the list of ready-to-run, non-real-time processes to be run on a processor. The processes at the head of the list run before the ones further down the list.
The functions require the inclusion of the sched.h
header file. Ensure you always check the return codes from functions.
37.2. Setting the process priority using a library call
The scheduler policy and other parameters can be set using the sched_setscheduler()
function. Currently, real-time policies have one parameter, sched_priority
. This parameter is used to adjust the priority of the process.
The sched_setscheduler()
function requires three parameters, in the form: sched_setscheduler(pid_t pid, int policy, const struct sched_param *sp);
.
The sched_setscheduler(2)
man page lists all possible return values of sched_setscheduler()
, including the error codes.
If the process ID is zero, the sched_setscheduler()
function acts on the calling process.
The following code excerpt sets the scheduler policy of the current process to the SCHED_FIFO
scheduler policy and the priority to 50
:
struct sched_param sp = { .sched_priority = 50 }; int ret; ret = sched_setscheduler(0, SCHED_FIFO, &sp); if (ret == -1) { perror("sched_setscheduler"); return 1; }
37.3. Setting the process priority parameter using a library call
The sched_setparam()
function is used to set the scheduling parameters of a particular process. This can then be verified using the sched_getparam()
function.
Unlike the sched_getscheduler()
function, which only returns the scheduling policy, the sched_getparam()
function returns all scheduling parameters for the given process.
Procedure
Use the following code excerpt that reads the priority of a given real-time process and increments it by two:
struct sched_param sp; int ret; ret = sched_getparam(0, &sp); sp.sched_priority += 2; ret = sched_setparam(0, &sp);
If this code were used in a real application, it would need to check the return values from the function and handle any errors appropriately.
Be careful with incrementing priorities. Continually adding two to the scheduler priority, as in this example, might eventually lead to an invalid priority.
37.4. Setting the scheduling policy and associated attributes for a process
The sched_setattr()
function sets the scheduling policy and its associated attributes for an instance ID specified in PID. When pid=0, sched_setattr()
acts on the process and attributes of the calling thread.
Procedure
-
Call
sched_setattr()
specifying the process ID on which the call acts and one of the following real-time scheduling policies:
Real-time scheduling policies
SCHED_FIFO
- Schedules a first-in and first-out policy.
SCHED_RR
- Schedules a round-robin policy.
SCHED_DEADLINE
- Schedules a deadline scheduling policy.
Linux also supports the following non-real-time scheduling policies:
Non-real-time scheduling policies
SCHED_OTHER
- Schedules the standard round-robin time-sharing policy.
SCHED_BATCH
- Schedules a “batch" style execution of processes.
SCHED_IDLE
Schedules very low priority background jobs.
SCHED_IDLE
can be used only at static priority0
, and the nice value has no influence for this policy.This policy is intended for running jobs at extremely low priority (lower than a +19 nice value using
SCHED_OTHER
orSCHED_BATCH
policies).