📄 wait_queue.txt
字号:
any problem,send mail to netxiong@263.net
***************等待队列的使用方法和实现机理********************************
等待队列涉及到以下几个文件
sched.h
sched.c
list.h
wait.h
fork.c
有以下几个函数。
interruptible_sleep_on //sched.c
sleep_on //sched.c
interruptible_sleep_on_timeout //sched.c
sleep_on_timeout //sched.c
wait_event //sched.h
wait_event_interruptible //sched.h
wake_up //sched.c
wake_up_interruptible //sched.c
一共有两种休眠方式,一种使用interruptible_sleep_on组,这一组的休眠函数进入休眠后,一旦唤醒就直接执行下去,
第二种方式是使用wait_event组,这一组休眠函数进入休眠后,一旦唤醒,在函数内部还要在监测一下判断条件,如果条件成立,就进入执行状态,否则的话继续循环,重新调度,进入休眠。
两种方式的唤醒都是使用wake_up组的函数。
所以,实际上两者的区别就是一个condition,也就是说,使用sleep_on时,当被唤醒时,他所等待的某些条件不一定就满足了,所以一般要有一个while循环,来对条件进行监测,例如
while(true)
{
if condition = true //如果条件满足,退出。
break;
sleep_on() //否则,继续休眠。
}
但在wait_event中,这一不已经被缺省做了,(参见源程序)。
*****************************************************************************
****************使用方*************************************
使用方法:一般来说,我们写内核程序的时候不用直接使用wait_queue_t结构,
#我们只用定义一个wait_queue_head_t型的变量,
#使用DECLARE_WAIT_QUEUE_HEAD或者init_waitqueue_head。
#然后使用wait_event或者wait_event_interruptible(在/inlcude/linux/sched.h中定义)进行等待就 可以了,其他的操作在这两个函数中都做了,包括声明一个包含一个要加入到等待队列的进程的wait_queue_t变量,和改变量怎样连接到wait_queue_head_t变量中去都做好了。
#唤醒函数使用wake_up或者wait_up_interruptible(在/kernel/sched.c中定义)。
*****************************************************************************
**************另外一种等待队列的使用方法*********************
以上的等待方法都是不加锁的等待方法,但是有时候需要一种加锁等待机制,比如,请求一种临界资源,
这个时候,就需要在等待的时候进行加锁操作。
这里,md设备提供了一种比较好的方法,一套成熟的机制。
参看md_k.h文件中的wait_event_lock_irq(wq, condition, lock)
使用方法可以参考raid5.c中的使用步骤,基本的使用方法与上面的机种基本一致。
*************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -