Merge pull request #72 from ClawSeven/dev_scheduler

Reimplement scheduler with intrusive linked list
This commit is contained in:
Tate, Hongliang Tian 2023-02-15 21:41:13 +08:00 committed by GitHub
commit df1e2203cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 17 additions and 5 deletions

View File

@ -18,6 +18,7 @@ uart_16550 = "0.2.0"
pod = {path = "../pod"} pod = {path = "../pod"}
pod-derive = {path = "../pod-derive"} pod-derive = {path = "../pod-derive"}
acpi= "4.1.1" acpi= "4.1.1"
intrusive-collections = "0.9.5"
[dependencies.lazy_static] [dependencies.lazy_static]
version = "1.0" version = "1.0"

View File

@ -11,4 +11,4 @@ pub use self::scheduler::{set_scheduler, Scheduler};
pub(crate) use self::task::context_switch; pub(crate) use self::task::context_switch;
pub(crate) use self::task::TaskContext; pub(crate) use self::task::TaskContext;
pub(crate) use self::task::SWITCH_TO_USER_SPACE_TASK; pub(crate) use self::task::SWITCH_TO_USER_SPACE_TASK;
pub use self::task::{Task, TaskStatus}; pub use self::task::{Task, TaskStatus, TaskAdapter};

View File

@ -11,6 +11,9 @@ use crate::user::{syscall_switch_to_user_space, trap_switch_to_user_space, UserS
use crate::vm::{VmAllocOptions, VmFrameVec}; use crate::vm::{VmAllocOptions, VmFrameVec};
use crate::{prelude::*, UPSafeCell}; use crate::{prelude::*, UPSafeCell};
use intrusive_collections::intrusive_adapter;
use intrusive_collections::LinkedListAtomicLink;
use super::processor::{current_task, schedule}; use super::processor::{current_task, schedule};
core::arch::global_asm!(include_str!("switch.S")); core::arch::global_asm!(include_str!("switch.S"));
@ -66,6 +69,7 @@ lazy_static! {
}, },
exit_code: usize::MAX, exit_code: usize::MAX,
kstack: KernelStack::new(), kstack: KernelStack::new(),
link: LinkedListAtomicLink::new(),
}; };
task.task_inner.exclusive_access().task_status = TaskStatus::Runnable; task.task_inner.exclusive_access().task_status = TaskStatus::Runnable;
task.task_inner.exclusive_access().ctx.rip = context_switch_to_user_space as usize; task.task_inner.exclusive_access().ctx.rip = context_switch_to_user_space as usize;
@ -98,8 +102,12 @@ pub struct Task {
exit_code: usize, exit_code: usize,
/// kernel stack, note that the top is SyscallFrame/TrapFrame /// kernel stack, note that the top is SyscallFrame/TrapFrame
kstack: KernelStack, kstack: KernelStack,
link: LinkedListAtomicLink,
} }
// TaskAdapter struct is implemented for building relationships between doubly linked list and Task struct
intrusive_adapter!(pub TaskAdapter = Arc<Task>: Task { link: LinkedListAtomicLink });
pub(crate) struct TaskInner { pub(crate) struct TaskInner {
pub task_status: TaskStatus, pub task_status: TaskStatus,
pub ctx: TaskContext, pub ctx: TaskContext,
@ -166,6 +174,7 @@ impl Task {
}, },
exit_code: 0, exit_code: 0,
kstack: KernelStack::new(), kstack: KernelStack::new(),
link: LinkedListAtomicLink::new(),
}; };
result.task_inner.exclusive_access().task_status = TaskStatus::Runnable; result.task_inner.exclusive_access().task_status = TaskStatus::Runnable;
@ -210,6 +219,7 @@ impl Task {
}, },
exit_code: 0, exit_code: 0,
kstack: KernelStack::new(), kstack: KernelStack::new(),
link: LinkedListAtomicLink::new(),
}; };
result.task_inner.exclusive_access().task_status = TaskStatus::Runnable; result.task_inner.exclusive_access().task_status = TaskStatus::Runnable;

View File

@ -18,6 +18,7 @@ jinux-rights-proc = {path="../jinux-rights-proc"}
jinux-util = {path="../jinux-util"} jinux-util = {path="../jinux-util"}
virtio-input-decoder = "0.1.4" virtio-input-decoder = "0.1.4"
ascii = { version = "1.1", default-features = false, features = ["alloc"] } ascii = { version = "1.1", default-features = false, features = ["alloc"] }
intrusive-collections = "0.9.5"
# parse elf file # parse elf file
xmas-elf = "0.8.0" xmas-elf = "0.8.0"

View File

@ -1,16 +1,16 @@
use crate::prelude::*; use crate::prelude::*;
use jinux_frame::task::{set_scheduler, Scheduler, Task}; use jinux_frame::task::{set_scheduler, Scheduler, Task, TaskAdapter};
pub const TASK_INIT_CAPABILITY: usize = 16; use intrusive_collections::LinkedList;
pub struct FifoScheduler { pub struct FifoScheduler {
tasks: Mutex<VecDeque<Arc<Task>>>, tasks: Mutex<LinkedList<TaskAdapter>>,
} }
impl FifoScheduler { impl FifoScheduler {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
tasks: Mutex::new(VecDeque::with_capacity(TASK_INIT_CAPABILITY)), tasks: Mutex::new(LinkedList::new(TaskAdapter::new())),
} }
} }
} }