实时进程RT的调度策略RR

来源:互联网 发布:cnc数控模拟软件 编辑:程序博客网 时间:2024/05/22 09:03

Time Slice 目前只用于RR策略.
默认的时间片长度是100 毫秒

/* * These are the 'tuning knobs' of the scheduler: * * default timeslice is 100 msecs (used only for SCHED_RR tasks). * Timeslices get refilled after they expire. */#define DEF_TIMESLICE       (100 * HZ / 1000)

当处理Tick 的周期调度任务时

static void task_tick_rt(struct rq *rq, struct task_struct *p, int queued){    update_curr_rt(rq);    watchdog(rq, p);    /*     * RR tasks need a special form of timeslice management.     * FIFO tasks have no timeslices.     */    if (p->policy != SCHED_RR)?// 如果不等于RR的话直接返回.        return;    if (--p->rt.time_slice)// 时间片减去1单位        return;    p->rt.time_slice = DEF_TIMESLICE;//(100 * HZ / 1000)    /*     * Requeue to the end of queue if we are not the only element     * on the queue:     */    if (p->rt.run_list.prev != p->rt.run_list.next) {//判断是否唯一        requeue_task_rt(rq, p, 0);// 如果当前进程不是RQ上面的唯一进程时,重新加到队列尾部.        set_tsk_need_resched(p);//设置重新需要调度标志位.    }}

把task 放到队列尾部.

/* * Put task to the end of the run list without the overhead of dequeue * followed by enqueue. */static voidrequeue_rt_entity(struct rt_rq *rt_rq, struct sched_rt_entity *rt_se, int head){    if (on_rt_rq(rt_se)) {        struct rt_prio_array *array = &rt_rq->active;        struct list_head *queue = array->queue + rt_se_prio(rt_se);        if (head)            list_move(&rt_se->run_list, queue);        else            list_move_tail(&rt_se->run_list, queue);    }}