相比较其他调度算法而言,时间片的轮转更多的注重公平性。但是,任务与任务之间也是有先后之分的,有的任务我们希望多安排一些时间片,而有的任务我们则希望少安排一些时间片。比较说,如果我们在上网的话,我们希望上网的操作响应的更快一些;如果我们在进行GUI操作,我们当然希望图形响应更快一些。这些都是可以理解的,下面我们绪要对数据结构进行一些修改。
typedef struct _TASK_INFO
{
    UINT32 id;
    UINT32* stack;
    UINT32 size;
    UINT32 context;
    UINT32 priority;
    UINT32 time_slice;
    void (*func)();

}TASK_INFO;
 


  这里的priority是当前线程的优先级,所以简单的方法是根据priority直接分配对应的time_slice。也是这个函数,


void reset_time_slice ()
{
    int index;

    for(index = 0; index < THREAD_MAX_NUMBER; index++)
        gAllTask[index].time_slice = gAllTask[index].priority + 1;
}
 


  所以,以后每次调度的时候,我们首先寻找当前高优先级的任务,看看当前任务安排的时间片是否用完了,没有用完继续运行。如果当前优先级的任务已经没有时间片了,那么此时可以安排低优先级的任务进行调度了。


void signal_handler(int m)
{
        int index;

start:
        index = find_next_thread();
        if(-1 == index)
        {
            reset_time_slice();
            goto start;
        }

        gAllTask[index].time_slice --;
        current_thread_id = index;
        swap(&old, &gAllTask[current_thread_id].context);
}
 


  下面,我们根据任务优先级挑选下一个需要运行的thread了,


int find_next_thread()
{
    int index;

    for(index = THREAD_MAX_NUMBER -1; index >=0; index --)
    {
        if(0 != gAllTask[index].time_slice)
            break;
    }

    return index;     
}