当前位置: 技术问答>linux和unix
linux进程调度问题
来源: 互联网 发布时间:2016-08-08
本文导语: linux进程调度相关的结构有:runqueue,prio_arry,list_head struct prio_arry { int nr_active; unsigned long bigmap[BITMAP_SIZE]; struct list_head queue[MAX_PRIO];//每种优先级的都包含一个相应的队列...
linux进程调度相关的结构有:runqueue,prio_arry,list_head
struct prio_arry
{
int nr_active;
unsigned long bigmap[BITMAP_SIZE];
struct list_head queue[MAX_PRIO];//每种优先级的都包含一个相应的队列
};
其中queue成员是一个数组,每个元素表示某种优先级上的可执行任务队列
但是list_head结构的定义如下:
struct list_head
{
struct list_head *next, *prev;
};
看不懂,怎么得到任务的。。。
比如我现在已经得到了一个list_head,表示某种优先级的可执行任务队列,那我怎么从这个list_head中得到任务???
望高手不吝赐教阿,谢谢
struct prio_arry
{
int nr_active;
unsigned long bigmap[BITMAP_SIZE];
struct list_head queue[MAX_PRIO];//每种优先级的都包含一个相应的队列
};
其中queue成员是一个数组,每个元素表示某种优先级上的可执行任务队列
但是list_head结构的定义如下:
struct list_head
{
struct list_head *next, *prev;
};
看不懂,怎么得到任务的。。。
比如我现在已经得到了一个list_head,表示某种优先级的可执行任务队列,那我怎么从这个list_head中得到任务???
望高手不吝赐教阿,谢谢
|
你说的是O(1)调度器,2.6.23以上被废了
你要实现的功能可以参考2.6.22的/kernel/sched.c
中的schedule()
你要实现的功能可以参考2.6.22的/kernel/sched.c
中的schedule()
asmlinkage void __sched schedule(void)
{
struct task_struct *prev, *next;
struct prio_array *array;
struct list_head *queue;
struct rq *rq;
int cpu, idx, new_prio;
...
rq = this_rq();
array = rq->active;
idx = sched_find_first_bit(array->bitmap); //查找位图中第一个为1的位,即最高优先级对应的位
queue = array->queue + idx; //取出相应优先级的list_head
//得到该优先级第一个task_struct
next = list_entry(queue->next, struct task_struct, run_list);
...
}