From 49249f4ec94fad7baf923aed68d9a7b2da3de3d4 Mon Sep 17 00:00:00 2001 From: Bullet <93781792+GP-Bullet@users.noreply.github.com> Date: Sat, 13 May 2023 09:55:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=8A=E8=B0=83=E5=BA=A6=E5=99=A8=E5=AE=9E?= =?UTF-8?q?=E4=BE=8B=E7=9A=84=E8=A3=B8=E6=8C=87=E9=92=88=E6=94=B9=E4=B8=BA?= =?UTF-8?q?Option=20(#262)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/kernel/sched/cfs.md | 4 ++-- kernel/src/sched/cfs.rs | 13 ++++++------- kernel/src/sched/rt.rs | 8 +++----- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/docs/kernel/sched/cfs.md b/docs/kernel/sched/cfs.md index be08ff0d..caaeb538 100644 --- a/docs/kernel/sched/cfs.md +++ b/docs/kernel/sched/cfs.md @@ -4,7 +4,7 @@ ## 1. CFSQueue 介绍 -   CFSQueue是用来存放普通进程的调度队列,每个CPU维护一个RTQueue,主要使用Vec作为主要存储结构来实现。 +   CFSQueue是用来存放普通进程的调度队列,每个CPU维护一个CFSQueue,主要使用Vec作为主要存储结构来实现。 ### 1.1 主要函数 1. enqueue(): 将pcb入队列 @@ -17,7 +17,7 @@ ### 2.1 主要函数 -1. sched(): 是对于Scheduler trait的sched()实现,是实时进程进行调度时的逻辑处理,该函数会返回接下来要执行的pcb,若没有符合要求的pcb,返回None +1. sched(): 是对于Scheduler trait的sched()实现,是普通进程进行调度时的逻辑处理,该函数会返回接下来要执行的pcb,若没有符合要求的pcb,返回None 2. enqueue(): 同样是对于Scheduler trait的sched()实现,将一个pcb加入调度器的调度队列 3. update_cpu_exec_proc_jiffies(): 更新这个cpu上,这个进程的可执行时间。 4. timer_update_jiffies(): 时钟中断到来时,由sched的core模块中的函数,调用本函数,更新CFS进程的可执行时间 diff --git a/kernel/src/sched/cfs.rs b/kernel/src/sched/cfs.rs index 50042bb5..ffc0010c 100644 --- a/kernel/src/sched/cfs.rs +++ b/kernel/src/sched/cfs.rs @@ -15,8 +15,7 @@ use crate::{ use super::core::{sched_enqueue, Scheduler}; /// 声明全局的cfs调度器实例 - -pub static mut CFS_SCHEDULER_PTR: *mut SchedulerCFS = null_mut(); +pub static mut CFS_SCHEDULER_PTR: Option> = None; /// @brief 获取cfs调度器实例的可变引用 #[inline] @@ -26,18 +25,18 @@ pub fn __get_cfs_scheduler() -> &'static mut SchedulerCFS { /// @brief 初始化cfs调度器 pub unsafe fn sched_cfs_init() { - if CFS_SCHEDULER_PTR.is_null() { - CFS_SCHEDULER_PTR = Box::leak(Box::new(SchedulerCFS::new())); + if CFS_SCHEDULER_PTR.is_none() { + CFS_SCHEDULER_PTR = Some(Box::new(SchedulerCFS::new())); } else { kBUG!("Try to init CFS Scheduler twice."); panic!("Try to init CFS Scheduler twice."); - } + } } /// @brief CFS队列(per-cpu的) #[derive(Debug)] struct CFSQueue { - /// 当前cpu上执行的进程,剩余的时间片 + /// 当前cpu上执行的进程剩余的时间片 cpu_exec_proc_jiffies: i64, /// 队列的锁 lock: RawSpinlock, @@ -100,7 +99,7 @@ impl CFSQueue { } } /// 获取运行队列的长度 - pub fn get_cfs_queue_size(&mut self) -> usize { + fn get_cfs_queue_size(&mut self) -> usize { return self.queue.len(); } } diff --git a/kernel/src/sched/rt.rs b/kernel/src/sched/rt.rs index 348a11f2..5737e78f 100644 --- a/kernel/src/sched/rt.rs +++ b/kernel/src/sched/rt.rs @@ -14,8 +14,7 @@ use crate::{ use super::core::{sched_enqueue, Scheduler}; /// 声明全局的rt调度器实例 - -pub static mut RT_SCHEDULER_PTR: *mut SchedulerRT = null_mut(); +pub static mut RT_SCHEDULER_PTR: Option> = None; /// @brief 获取rt调度器实例的可变引用 #[inline] @@ -26,14 +25,13 @@ pub fn __get_rt_scheduler() -> &'static mut SchedulerRT { /// @brief 初始化rt调度器 pub unsafe fn sched_rt_init() { kdebug!("rt scheduler init"); - if RT_SCHEDULER_PTR.is_null() { - RT_SCHEDULER_PTR = Box::leak(Box::new(SchedulerRT::new())); + if RT_SCHEDULER_PTR.is_none() { + RT_SCHEDULER_PTR = Some(Box::new(SchedulerRT::new())); } else { kBUG!("Try to init RT Scheduler twice."); panic!("Try to init RT Scheduler twice."); } } - /// @brief RT队列(per-cpu的) #[derive(Debug)] struct RTQueue {