123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- Reference for various scheduler-related methods in the O(1) scheduler
- Robert Love <rml@tech9.net>, MontaVista Software
- Note most of these methods are local to kernel/sched.c - this is by design.
- The scheduler is meant to be self-contained and abstracted away. This document
- is primarily for understanding the scheduler, not interfacing to it. Some of
- the discussed interfaces, however, are general process/scheduling methods.
- They are typically defined in include/linux/sched.h.
- Main Scheduling Methods
- -----------------------
- void load_balance(runqueue_t *this_rq, int idle)
- Attempts to pull tasks from one cpu to another to balance cpu usage,
- if needed. This method is called explicitly if the runqueues are
- inbalanced or periodically by the timer tick. Prior to calling,
- the current runqueue must be locked and interrupts disabled.
- void schedule()
- The main scheduling function. Upon return, the highest priority
- process will be active.
- Locking
- -------
- Each runqueue has its own lock, rq->lock. When multiple runqueues need
- to be locked, lock acquires must be ordered by ascending &runqueue value.
- A specific runqueue is locked via
- task_rq_lock(task_t pid, unsigned long *flags)
- which disables preemption, disables interrupts, and locks the runqueue pid is
- running on. Likewise,
- task_rq_unlock(task_t pid, unsigned long *flags)
- unlocks the runqueue pid is running on, restores interrupts to their previous
- state, and reenables preemption.
- The routines
- double_rq_lock(runqueue_t *rq1, runqueue_t *rq2)
- and
- double_rq_unlock(runqueue_t *rq1, runqueue_t *rq2)
- safely lock and unlock, respectively, the two specified runqueues. They do
- not, however, disable and restore interrupts. Users are required to do so
- manually before and after calls.
- Values
- ------
- MAX_PRIO
- The maximum priority of the system, stored in the task as task->prio.
- Lower priorities are higher. Normal (non-RT) priorities range from
- MAX_RT_PRIO to (MAX_PRIO - 1).
- MAX_RT_PRIO
- The maximum real-time priority of the system. Valid RT priorities
- range from 0 to (MAX_RT_PRIO - 1).
- MAX_USER_RT_PRIO
- The maximum real-time priority that is exported to user-space. Should
- always be equal to or less than MAX_RT_PRIO. Setting it less allows
- kernel threads to have higher priorities than any user-space task.
- MIN_TIMESLICE
- MAX_TIMESLICE
- Respectively, the minimum and maximum timeslices (quanta) of a process.
- Data
- ----
- struct runqueue
- The main per-CPU runqueue data structure.
- struct task_struct
- The main per-process data structure.
- General Methods
- ---------------
- cpu_rq(cpu)
- Returns the runqueue of the specified cpu.
- this_rq()
- Returns the runqueue of the current cpu.
- task_rq(pid)
- Returns the runqueue which holds the specified pid.
- cpu_curr(cpu)
- Returns the task currently running on the given cpu.
- rt_task(pid)
- Returns true if pid is real-time, false if not.
- Process Control Methods
- -----------------------
- void set_user_nice(task_t *p, long nice)
- Sets the "nice" value of task p to the given value.
- int setscheduler(pid_t pid, int policy, struct sched_param *param)
- Sets the scheduling policy and parameters for the given pid.
- int set_cpus_allowed(task_t *p, unsigned long new_mask)
- Sets a given task's CPU affinity and migrates it to a proper cpu.
- Callers must have a valid reference to the task and assure the
- task not exit prematurely. No locks can be held during the call.
- set_task_state(tsk, state_value)
- Sets the given task's state to the given value.
- set_current_state(state_value)
- Sets the current task's state to the given value.
- void set_tsk_need_resched(struct task_struct *tsk)
- Sets need_resched in the given task.
- void clear_tsk_need_resched(struct task_struct *tsk)
- Clears need_resched in the given task.
- void set_need_resched()
- Sets need_resched in the current task.
- void clear_need_resched()
- Clears need_resched in the current task.
- int need_resched()
- Returns true if need_resched is set in the current task, false
- otherwise.
- yield()
- Place the current process at the end of the runqueue and call schedule.
|