You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
rCore_stu/ch5/os/src/task/manager.rs

46 lines
1.2 KiB
Rust

use alloc::collections::VecDeque;
use alloc::sync::Arc;
use lazy_static::lazy_static;
use crate::println;
use crate::task::task::TaskControlBlock;
use crate::task::UPSafeCell;
/// 任务管理器 仅负责管理所有任务, 由ch4 TaskManager 拆分的,
/// 先入先出的双端队列
pub struct TaskManager {
ready_queue: VecDeque<Arc<TaskControlBlock>>,
}
impl TaskManager {
pub fn new() -> Self {
Self {
ready_queue: VecDeque::new(),
}
}
}
impl TaskManager {
// 添加一个任务到 队列中
pub fn add(&mut self, task: Arc<TaskControlBlock>) {
self.ready_queue.push_back(task);
}
// 如果有任务, 弹出第一个任务
pub fn fetch(&mut self) -> Option<Arc<TaskControlBlock>> {
self.ready_queue.pop_front()
}
}
lazy_static! {
// 全局的任务管理器
pub static ref TASK_MANAGER: UPSafeCell<TaskManager> = unsafe { UPSafeCell::new(TaskManager::new()) };
}
/// 给全局任务管理器添加任务
pub fn add_task(task: Arc<TaskControlBlock>) {
TASK_MANAGER.exclusive_access().add(task);
}
// 全局任务管理器 弹出任务
pub fn pop_task() -> Option<Arc<TaskControlBlock>> {
TASK_MANAGER.exclusive_access().fetch()
}