manual: Explain sched_yield semantics with different schedulers

The manual entry for sched_yield mentions that the function call could
be a nop if there are no other tasks with the same absolute priority.
Expand the explanation to include example schedulers on Linux so that
it's clear that sched_yield may not always result in a different task
being scheduled.

Signed-off-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
Reviewed-by: Joseph Myers <josmyers@redhat.com>
This commit is contained in:
Siddhesh Poyarekar 2025-01-30 10:05:17 -05:00
parent a2bd5008a9
commit 226476e322

View file

@ -929,18 +929,31 @@ function, so there are no specific @code{errno} values.
@c Direct syscall on Linux; alias to swtch on HURD. @c Direct syscall on Linux; alias to swtch on HURD.
This function voluntarily gives up the task's claim on the CPU. This function voluntarily gives up the task's claim on the CPU.
Depending on the scheduling policy in effect and the tasks ready to run
on the system, another task may be scheduled to run instead.
Technically, @code{sched_yield} causes the calling task to be made A call to @code{sched_yield} does not guarantee that a different task
immediately ready to run (as opposed to running, which is what it was from the calling task is scheduled as a result; it depends on the
before). This means that if it has absolute priority higher than 0, it scheduling policy used on the target system. It is possible that the
gets pushed onto the tail of the queue of tasks that share its call may not result in any visible effect, i.e., the same task gets
scheduled again.
For example on Linux systems, when a simple priority-based FIFO
scheduling policy (@code{SCHED_FIFO}) is in effect, the calling task is
made immediately ready to run (as opposed to running, which is what it
was before). This means that if it has absolute priority higher than 0,
it gets pushed onto the tail of the queue of tasks that share its
absolute priority and are ready to run, and it will run again when its absolute priority and are ready to run, and it will run again when its
turn next arrives. If its absolute priority is 0, it is more turn next arrives. If its absolute priority is 0, it is more
complicated, but still has the effect of yielding the CPU to other complicated, but still has the effect of yielding the CPU to other
tasks. tasks. If there are no other tasks that share the calling task's
absolute priority, it will be scheduled again as if @code{sched_yield}
was never called.
If there are no other tasks that share the calling task's absolute Another example could be a time slice based preemptive round-robin
priority, this function doesn't have any effect. policy, such as the @code{SCHED_RR} policy on Linux. It is possible
with this policy that the calling task is scheduled again because it
still has time left in its slice.
To the extent that the containing program is oblivious to what other To the extent that the containing program is oblivious to what other
processes in the system are doing and how fast it executes, this processes in the system are doing and how fast it executes, this