pub struct Scheduler<P>where
P: Platform,{
pub tasklet_scheduler: TaskletScheduler,
/* private fields */
}
Expand description
The global Scheduler
coordinates the main ‘run loop’ of the kernel, allocating CPU time to
userspace tasks. There is one global Scheduler
instance, which then holds a CpuScheduler
for each running processor to coordinate tasks running on that processor.
It is also responsible for managing spawned kernel asynchronous tasklets (which are somewhat
confusingly also often called Task
s) - this involves tracking tasks that have been ‘woken’
(are ready to make progress) and making sure they are polled regularly. The forward progress of
both userspace tasks and kernel tasklets are intertwined, and so are managed together.
Fields§
§tasklet_scheduler: TaskletScheduler
Implementations§
Source§impl<P> Scheduler<P>where
P: Platform,
impl<P> Scheduler<P>where
P: Platform,
pub fn new() -> Scheduler<P>
pub fn add_task(&self, task: Arc<Task<P>>)
pub fn for_this_cpu(&self) -> SpinlockGuard<'_, CpuScheduler<P>>
Sourcepub fn start_scheduling(&self) -> !
pub fn start_scheduling(&self) -> !
Start scheduling! This should be called after a platform has finished initializing, and is diverging. It gives kernel tasklets an initial poll while we’re here in the kernel, and then drops down into userspace.
Sourcepub fn schedule(&self, new_state: TaskState)
pub fn schedule(&self, new_state: TaskState)
Called when a userspace task yields or is pre-empted. This is responsible for the ‘scheduling’ part of the scheduler - it polls kernel tasklets as they need attention, and shares CPU time between userspace tasks.
On each call to schedule
, the kernel can choose to:
- Give CPU time to the kernel-space tasklet scheduler
- Switch to another userspace task
- Steal work from another CPU’s scheduler
- Idle the CPU, if there is nothing to be done
- Nothing
If the current task is switched away from, it will be placed in the state new_state
. This
allows the caller to block the current task on a dependency. If a task has been pre-empted
or yields, it should be placed into TaskState::Ready
.
Auto Trait Implementations§
impl<P> !Freeze for Scheduler<P>
impl<P> !RefUnwindSafe for Scheduler<P>
impl<P> Send for Scheduler<P>
impl<P> Sync for Scheduler<P>
impl<P> Unpin for Scheduler<P>
impl<P> !UnwindSafe for Scheduler<P>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can then be
further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<dyn Any>
. Rc<dyn Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Anydyn Any
. This is needed since Rust cannot
generate &Anydyn Any
’s vtable from &Trait
’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Anydyn Any
. This is needed since Rust cannot
generate &mut dyn Any
’s vtable from &mut Trait
’s.