mirror of
git://sourceware.org/git/glibc.git
synced 2025-03-06 20:58:33 +01:00
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:
parent
a2bd5008a9
commit
226476e322
1 changed files with 20 additions and 7 deletions
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue