10.4实现时间片轮转算法
之前我们还是未实现时间片轮转,容易造成进程饥饿
使用之前8253定时器的原理
给任务结构体里面加两个字段
#define TASK_TIME_SLICE_DEFAULT 10 // 时间片计数
int time_slice; // 时间片 10ms/单位(之前给8253设置时候就设置了)
int slice_ticks; // 递减时间片计数 减到0就切换
//time.c
void do_handler_timer (exception_frame_t *frame) {
sys_tick++;
// 先发EOI,而不是放在最后
// 放最后将从任务中切换出去之后,除非任务再切换回来才能继续噢应
pic_send_eoi(IRQ0_TIMER);
task_time_tick(); //任务定时方面的处理(注意这个函数和上面那个函数的顺序关系)
}
//task.c
void task_time_tick (void) {
task_t * curr_task = task_current(); //取出当前任务
// 时间片的处理
if (--curr_task->slice_ticks == 0) { //当时间片用完(过了100ms),切换任务
// 时间片用完,重新加载时间片
// 对于空闲任务,此处减未用
curr_task->slice_ticks = 10; //初始话时间片
// 调整队列的位置到尾部,不用直接操作队列
task_set_block(curr_task);
task_set_ready(curr_task);
task_dispatch();
}
}