⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wait_queue.txt

📁 linux内核学习笔记 希望想看的人可以很快下载到
💻 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 + -