Skip to content

Commit f9b05ee

Browse files
committed
update
1 parent 88c308d commit f9b05ee

File tree

4 files changed

+223
-45
lines changed

4 files changed

+223
-45
lines changed

os/src/syscall/process.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
//! Process management syscalls
22
//!
33
use alloc::sync::Arc;
4+
use crate::task::BIG_STRIDE;
45

56
use crate::{
67
fs::{open_file, OpenFlags},
@@ -152,10 +153,22 @@ pub fn sys_spawn(_path: *const u8) -> isize {
152153
}
153154

154155
// YOUR JOB: Set task priority.
155-
pub fn sys_set_priority(_prio: isize) -> isize {
156+
pub fn sys_set_priority(prio: isize) -> isize {
156157
trace!(
157158
"kernel:pid[{}] sys_set_priority NOT IMPLEMENTED",
158159
current_task().unwrap().pid.0
159160
);
160-
-1
161+
if prio < 2 {
162+
return -1; // 优先级必须 >= 2
163+
}
164+
165+
let prio = prio as usize;
166+
let current_task = current_task().unwrap();
167+
let mut inner = current_task.inner_exclusive_access();
168+
169+
// 更新优先级和步长
170+
inner.priority = prio;
171+
inner.pass = BIG_STRIDE / prio;
172+
173+
prio as isize
161174
}

os/src/task/manager.rs

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::sync::UPSafeCell;
44
use alloc::collections::VecDeque;
55
use alloc::sync::Arc;
66
use lazy_static::*;
7+
use crate::task::current_task;
78
///A array of `TaskControlBlock` that is thread-safe
89
pub struct TaskManager {
910
ready_queue: VecDeque<Arc<TaskControlBlock>>,
@@ -25,6 +26,85 @@ impl TaskManager {
2526
pub fn fetch(&mut self) -> Option<Arc<TaskControlBlock>> {
2627
self.ready_queue.pop_front()
2728
}
29+
/// 在当前任务的页表中映射一段虚拟地址区域
30+
pub fn sys_mmap_tcb(&mut self, start: usize, len: usize, prot: usize) -> isize {
31+
if let Some(task) = current_task() {
32+
let mut inner = task.inner_exclusive_access();
33+
inner.sys_mmap_tcb(start, len, prot)
34+
} else {
35+
-1
36+
}
37+
}
38+
/// 在当前任务的页表中取消映射一段虚拟地址区域
39+
pub fn sys_munmap_tcb(&mut self, start: usize, len: usize) -> isize {
40+
if let Some(task) = current_task() {
41+
let mut inner = task.inner_exclusive_access();
42+
inner.sys_munmap_tcb(start, len)
43+
} else {
44+
-1
45+
}
46+
}
47+
48+
/// 选择 stride 最小的任务进行调度
49+
pub fn fetch_stride(&mut self) -> Option<Arc<TaskControlBlock>> {
50+
if self.ready_queue.is_empty() {
51+
None
52+
} else {
53+
// 找到 stride 最小的任务
54+
let mut min_stride = usize::MAX;
55+
let mut min_index = 0;
56+
57+
for (i, task) in self.ready_queue.iter().enumerate() {
58+
let inner = task.inner_exclusive_access();
59+
if inner.stride < min_stride {
60+
min_stride = inner.stride;
61+
min_index = i;
62+
}
63+
}
64+
65+
// 移除选中的任务
66+
let task = self.ready_queue.remove(min_index).unwrap();
67+
68+
// 更新被选中任务的 stride
69+
{
70+
let pass = {
71+
let inner = task.inner_exclusive_access();
72+
inner.pass
73+
}; // 这里 inner 被释放
74+
75+
let mut inner = task.inner_exclusive_access();
76+
// 检查溢出
77+
if let Some(new_stride) = inner.stride.checked_add(pass) {
78+
inner.stride = new_stride;
79+
} else {
80+
// 处理溢出:归一化所有任务的 stride
81+
inner.stride = pass;
82+
self.normalize_strides();
83+
}
84+
} // 这里 inner 被释放
85+
86+
Some(task)
87+
}
88+
}
89+
90+
/// 归一化所有任务的 stride 值,避免溢出
91+
fn normalize_strides(&mut self) {
92+
if self.ready_queue.is_empty() {
93+
return;
94+
}
95+
96+
// 找到最小的 stride
97+
let min_stride = self.ready_queue.iter()
98+
.map(|task| task.inner_exclusive_access().stride)
99+
.min()
100+
.unwrap();
101+
102+
// 所有任务减去最小 stride
103+
for task in self.ready_queue.iter_mut() {
104+
let mut inner = task.inner_exclusive_access();
105+
inner.stride = inner.stride.saturating_sub(min_stride);
106+
}
107+
}
28108
}
29109

30110
lazy_static! {
@@ -44,3 +124,13 @@ pub fn fetch_task() -> Option<Arc<TaskControlBlock>> {
44124
//trace!("kernel: TaskManager::fetch_task");
45125
TASK_MANAGER.exclusive_access().fetch()
46126
}
127+
128+
/// 在当前任务的页表中映射一段虚拟地址区域
129+
pub fn sys_mmap_tcb(start: usize, len: usize, prot: usize) -> isize {
130+
TASK_MANAGER.exclusive_access().sys_mmap_tcb(start, len, prot)
131+
}
132+
133+
/// 在当前任务的页表中取消映射一段虚拟地址区域
134+
pub fn sys_munmap_tcb(start: usize, len: usize) -> isize {
135+
TASK_MANAGER.exclusive_access().sys_munmap_tcb(start, len)
136+
}

os/src/task/processor.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,8 @@ use crate::trap::TrapContext;
1212
use alloc::sync::Arc;
1313
use lazy_static::*;
1414

15-
<<<<<<< HEAD
1615
use crate::task::add_task;
1716

18-
=======
19-
>>>>>>> e5b3d74 (Initialize ch6)
2017
/// Processor management structure
2118
pub struct Processor {
2219
///The task currently executing on the current processor
@@ -109,7 +106,6 @@ pub fn current_trap_cx() -> &'static mut TrapContext {
109106
pub fn schedule(switched_task_cx_ptr: *mut TaskContext) {
110107
let mut processor = PROCESSOR.exclusive_access();
111108
let idle_task_cx_ptr = processor.get_idle_task_cx_ptr();
112-
<<<<<<< HEAD
113109
// 将当前任务放回就绪队列(如果它还是可运行的)
114110
if let Some(current) = &processor.current {
115111
let mut inner = current.inner_exclusive_access();
@@ -121,8 +117,6 @@ pub fn schedule(switched_task_cx_ptr: *mut TaskContext) {
121117
add_task(current.clone());
122118
}
123119
}
124-
=======
125-
>>>>>>> e5b3d74 (Initialize ch6)
126120
drop(processor);
127121
unsafe {
128122
__switch(switched_task_cx_ptr, idle_task_cx_ptr);

0 commit comments

Comments
 (0)