将进程p从优先级数组array(优先级数组array的某个元素[array->queue + p->prio]所代表的优先级队列)
中删除;查看[array->queue + p->prio]所代表的优先级队列中是否还有活跃进程,如果没有将要清除优先级位图bitmap[]
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);
}
array->bitmap 代表优先级位图bitmap[]数组的首地址
判断head索引的双链表是否为空,为空返回true,否则返回false
static
inline
int
list_empty(
const
struct
list_head
*
head)
{
return head->next == head;
}
static
inline
void
__clear_bit(
int
nr,
volatile
unsigned
long
*
addr)
{
__asm__ __volatile__(
"btrl %1,%0"
:"=m" (ADDR)
:"Ir" (nr));
}
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);
}
array->bitmap 代表优先级位图bitmap[]数组的首地址
判断head索引的双链表是否为空,为空返回true,否则返回false
static
inline
int
list_empty(
const
struct
list_head
*
head)
{
return head->next == head;
}
static
inline
void
__clear_bit(
int
nr,
volatile
unsigned
long
*
addr)
{
__asm__ __volatile__(
"btrl %1,%0"
:"=m" (ADDR)
:"Ir" (nr));
}
优先级调度与任务队列管理
本文介绍了一个操作系统内核中的任务调度机制,详细解释了如何从优先级队列中移除进程,并更新优先级位图的过程。通过具体的代码实现展示了如何检查优先级队列是否为空,并清空相应的优先级位图。

1492

被折叠的 条评论
为什么被折叠?



