嵌入式操作系统内核原理和开发(通用优先级调度)
作者:网络转载 发布时间:[ 2012/6/12 13:24:23 ] 推荐标签:
相比较其他调度算法而言,时间片的轮转更多的注重公平性。但是,任务与任务之间也是有先后之分的,有的任务我们希望多安排一些时间片,而有的任务我们则希望少安排一些时间片。比较说,如果我们在上网的话,我们希望上网的操作响应的更快一些;如果我们在进行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;
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11