200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > wake_up()函数集合

wake_up()函数集合

时间:2021-09-12 00:48:50

相关推荐

wake_up()函数集合

唤醒等待队列中的等待进程的函数wake_up()函数的核心实现函数是__wake_up_common()函数。

__wake_up_common(wait_queue_head_t *q, int mode,

int nr_exclusive, int wake_flags, void *key)

参数介绍:

q : 是等待队列头;

mode: 是进程的状态模式

其取值为: TASK_INTERRUPTIBLE, TASK_UNITERRUPTIBLE

nr_exclusive:是 number exclusive;

wake_flags : 是同步唤醒sync,还是异步唤醒 async;

key : 一般为NULL;

static void __wake_up_common(wait_queue_head_t *q, int mode,

int nr_exclusive, int wake_flags, void *key)

{

wait_queue_t *curr, *next;

list_for_each_entry_safe(curr, next, &q->task_list, task_list)

{

unsigned int flags = curr->flags;

if( curr->func(curr, mode, wake_flags, key) &&

(flags & WQ_FLAG_EXCLUSIVE) && !--nr_exclusive )

break;

}

}

解读一下 __wake_up_common()函数:

list_for_each_entry_safe()函数用于遍历等待队列中的数据项,并且在curr中存放当前的wait_queue_t项的地址;

curr->func()是用来唤醒等待队列中的进程的实现函数;

curr->func = autoremove_wake_function() 或 default_wake_function

其实autoremove_wake_function()与default_wake_function()函数的本质上是相同的,他们最终是在调用try_to_wake_up()函数的。

try_to_wake_up()函数是从等待队列中移走一个进程,然后将其放入到就绪队列中等待调度器schedule()的调度。

所以curr->func()函数的作用就是从等待队列中移走进程,将其放到就绪队列中,达到实现进程唤醒的目的。

__wake_up_common()函数是每次唤醒所有的等待进程,还是只唤醒一个,还是唤醒N个。这取决于 nr_exclusive 参数

当 nr_exclusive = 0时,__wake_up_common()每次唤醒所有的等待进程。

当 nr_exclusive = 1时,并且等待队列中的等待进程时互斥等待唤醒进程,则__wake_up_common()每次只唤醒一个等待进程。

当 nr_exclusive = N时,__wake_up_common()每次唤醒N个等待进程或者N-1个非互斥等待进程与1个互斥等待进程;

__wake_up()函数的实现:

void __wake_up(wait_queue_head_t *q, unsigned int mode,

int nr_exclusive, void *key)

{

unsigned int flags;

spin_lock_irqsave(&p->lock,flags);

__wake_up_common(q,mode,nr_exclusive,0,key);

spin_unlock_irqstore(&p->lock, flags);

}

wake_up()函数的实现:

#define wake_up(wq) __wake_up(wq, TASK_NORMAL, 1,NULL)

#define wake_up_nr(wq,nr) __wake_up(wq, TASK_NORMAL,nr, NULL)

#define wake_up_all(wq) __wake_up(wq, TASK_NORMAL, 0, NULL)

#define wake_up_interruptible(wq) \

__wake_up(wq,TASK_INTERRUPTIBLE,1,NULL)

#define wake_up_interruptible_nr(wq,nr) \

__wake_up(wq, TASK_INTERRUPTIBLE,nr,NULL)

#define wake_up_interruptible_all(wq) \

__wake_up(wq, TASK_INTERRUPTIBLE,0,NULL)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。