内核等待队列机制介绍
个 critical section。
extern inline void __remove_wait_queue(struct wait_queue ** p,struct
wait_queue * wait)
{
struct wait_queue * next = wait->next;
struct wait_queue * head = next;
struct wait_queue * tmp;
while ((tmp = head->next) != wait) {
head = tmp;
}
head->next = next;
}
__remove_wait_queue() 是一个 inline function,也是同样定义在 里。是用来将 wait 从 p 这个 wait_queue list 中移除掉。
现在,大家应该已经清楚了 interruptible_sleep_on() 和 sleep_on() 的做法,也应该比较清楚 wait_queue 是如何的做到 block IO。接下来,我们继续看 wake_up_interruptible() 和 wake_up() 是如何 implement 的。wake_up_interruptible() 和 wake_up() 其实是两个 macro,都定义在 里。
#define wake_up(x) __wake_up((x),TASK_UNINTERRUPTIBLE | \
TASK_INTERRUPTIBLE)
#define wake_up_interruptible(x) __wake_up((x),TASK_INTERRUPTIBLE)
从这里可以看出,两个 macro 几乎是一样的,差别只在于传给 __wake_up() 中的一个 flag 有所差异而已。其实,wake_up() 传给 __wake_up() 的是 TASK_UNINTERRUPTIBLE|TASK_INTERRUPTIBLE,意思是说它会将 wait_queue list 中 process->state 是 TASK_INTERRUPTIBLE 或 TASK_UNINTERRUPTIBLE 的所有 process 叫醒。而 wake_up_interruptible() 则只将 state是 TASK_INTERRUPTIBLE 的叫醒.
void __wake_up(struct wait_queue **q,unsigned int mode)
{
struct wait_queue *next;
read_lock(waitqueue_lock);
if (q (next = *q)) {
struct wait_queue *head;
head = WAIT_QUEUE_HEAD(q);
while (next != head) {
struct task_struct *p = next->task;
next = next->next;
if (p->state mode)
wake_up_process(p);
}
}
read_unlock(waitqueue_lock);
}
在 wake up 的过程中,我们不需要设定 write lock,但是仍要设定 read lock,这是为了避免有人在我们读取 wait_queue 时去写 wait_queue list 的内容,造成 inconsistent。在这段程序代码中,是去 transverse 整个 list,如果 process 的 state 跟 mode 有吻合,则呼叫 wake_up_process() 将它叫醒。
void wake_up_process(struct task_struct * p)
{
unsigned long flags;
spin_lock_irqsave(runqueue_lock,flags);
p->state = TASK_RUNNING;
if (!p->next_run) {
add_to_runqueue(p);
reschedule_idle(p);
}
spin_unlock_irqrestore(runqueue_lock,flags);
}
在此,runqueue_lock 也是一个 spin lock,kernel 依然在此设一个 critical section 以方便更改 run queue。Run queue 是用来放可以执行的 process 用的。在放入 run queue 之前,会先将 process 的 state 设为 TASK_RUNNING。
wait_queue 其实是一个蛮好用的东西。相信只要各位有机会去修改 kernel 的话,都应该有机会用到它才对。希望对大家有点帮助。
嵌入式新闻 嵌入式资料 嵌入式培训 嵌入式linux 嵌入式系统 嵌入式开发 嵌入式 相关文章:
- 煤矿井下综合自动化系统中的应用(04-06)
- 软件Overlay:程序编写与调试(01-20)
- USB数据通信接□模块的程序设计(10-17)
- 东江产业园:力争2017年产值达千亿(09-30)
- 硅谷数模的SlimPort扩大了Nexus7的显示屏选择(08-01)
- Lonworks控制网络技术在城市排水泵站自动化中的应用(06-06)
