等待队列,是指
linux系统中进程所组成的队列,就是需要其他事件的发生才会自己本身被唤醒的进程,也就是说这些进程本身是在等待其他某些进程为他 们提供进程发生的条件。他们是属于消费者的,但是他们要消耗的东西还没有产生,这些就是处于等待状态的进程,组成了等待队列。等待队列很容易使用, 尽管它的设计很是微妙, 但不需要知道它的内部细节。
操作方法
linux中的进程在系统执行的过程中会根据环境的不同而分成不同的状态。 根据各个进程状态的不同,从而分成了不同的队列,包括等待队列,就绪队列等。等待队列和就绪队列的用途都很大。
进程的状态主要有以下几种,Running---进程处 于运行(它是系统的当前进程)或者准备运行状态(它在等待系统将CPU分配给它)。Waiting---进程在等待一个事件或者资源。 Stopped---进程被停止,通常是通过接收一个信号。正在被调试的进程可能处于停止状态。Zombie(defunct)---僵死状态。
使用案例
处理等待队列的最佳方式就是依照如下操作:
1. 声明一个struct wait_queue *
变量. 你需要为每一个可以让进程睡眠的事件预备这样一个
变量. 这就是我建议你放在描述硬件特性
数据结构中的
数据项.
2. 将该变量的
指针作为
参数传递给不同的sleep_on和wake_up函数.
这相当容易. 例如, 让我们想象一下, 当进程读你的设备时, 你要让这个进程睡眠, 然后在某人向设备写数据后唤醒这个进程. 下面的代码就可以完成这些工作:
struct wait_queue *wq= NULL;
read_write_t sleepy_read(struct inode *inode, struct file *flip, char *buf, count_t count)
{
interruptible_sleep_on(&wq);
return 0;
}
read_write_t sleepy_write(struct inode *inode, struct file *flip, char *buf, count_t count)
{
wake_up_interruptible(&wq);
return count;
}