10.4实现时间片轮转算法

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();
    }
}
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值