美文网首页
linux kernel调度算法之任务优先级队列

linux kernel调度算法之任务优先级队列

作者: 平平淡淡的猪 | 来源:发表于2019-08-12 16:11 被阅读0次

1. 数据结构

struct prio_array {

    unsigned intnr_active; //优先级队列数据中task个数

    unsignedlong bitmap[BITMAP_SIZE];

    structlist_head queue[MAX_PRIO];

};

#define BITMAP_SIZE ((((MAX_PRIO+1+7)/8)+sizeof(long)-1)/sizeof(long))

//内核中long型占4个字节,一个字节8位,BITMAP_SIZE的值为5

2. 图解

图一:任务优先级队列

3. 队列操作函数解析

场景:将任务加入到对应优先级队列的尾部
static void enqueue_task(struct task_struct *p, prio_array_t *array)

{

    sched_info_queued(p);

    list_add_tail(&p->run_list, array->queue + p->prio);

    __set_bit(p->prio, array->bitmap);

    array->nr_active++;

    p->array = array;

}

场景:将任务从优先级队列中移除

static void dequeue_task(struct task_struct *p, prio_array_t *array)

{

    array->nr_active--;

    list_del(&p->run_list);

    if (list_empty(array->queue + p->prio))

    __clear_bit(p->prio, array->bitmap);

}

场景:将任务移动到对应优先级队列的尾部

/*

* Put task to the end of the run list without the overhead of dequeue

* followed by enqueue.

*/

static void requeue_task(struct task_struct *p, prio_array_t *array)

{

    list_move_tail(&p->run_list, array->queue + p->prio);

}

场景:将任务加入到对应优先级队列的首部

static inline void enqueue_task_head(struct task_struct *p, prio_array_t *array)

{

    list_add(&p->run_list, array->queue + p->prio);

    __set_bit(p->prio, array->bitmap);

    array->nr_active++;

    p->array = array;

}

相关文章

网友评论

      本文标题:linux kernel调度算法之任务优先级队列

      本文链接:https://www.haomeiwen.com/subject/cyuujctx.html