小白学Linux——等待队列(waitqueue)

等待队列介绍

当你编写Linux驱动程序、模块或内核程序时,某些进程会为了某些事件等待或休眠。在Linux中有多种处理睡眠和唤醒的方法,每种方法都适合不同的需求。等待队列(Waitqueue)也是处理这种情况的方法之一。

每当进程必须等待事件(例如数据到达或进程终止)时,它就应该进入睡眠状态。休眠会导致当前进程暂停执行,从而释放处理器给其它进程使用。一段时间后,进程等待的资源就绪之后,该进程会被唤醒。

等待队列是内核提供的一种实现等待的机制。顾名思义,等待队列是等待事件的进程列表。换句话说,等待队列用于在某个条件为真时等待某些资源就绪后唤醒队列中的进程。使用等待队列是需要注意竞争条件,避免出现死锁现象。

使用等待队列,有三个步骤:

  1. 初始化等待队列
  2. 将进程入队,等待资源就绪
  3. 唤醒队列中等待进程

初始化等待队列

将此头文件用于Waitqueue(/linux/wait.h)。有两种方式可以初始化等待队列。静态方式和动态方式。
基于linux2.6源码
静态方式:

DECLARE_WAIT_QUEUE_HEAD(wq);

#define __WAIT_QUEUE_HEAD_INITIALIZER(name) {
     				\
	.lock		= SPIN_LOCK_UNLOCKED,				\
	.task_list	= {
      &(name).task_list, &(name).task_list } }

#define DECLARE_WAIT_QUEUE_HEAD(name) \
	wait_queue_head_t name = __WAIT_QUEUE_HEAD_INITIALIZER(name)

struct __wait_queue_head {
   
	spinlock_t lock;
	struct list_head task_list;
};
typedef struct __wait_queue_head wait_queue_head_t;

其中“wq"是存放休眠进程的等待队列的名称。

动态方式:

wait_queue_head_t wq;
init_waitqueue_head (&wq);

static inline void init_waitqueue_head(wait_queue_head_t *q)
{
   
	q->lock = SPIN_LOCK_UNLOCKED;
	INIT_LIST_HEAD(&q->task_list);
}

可以使用上述任何一种方法创建等待队列。除了创建等待队列的方式之外,其他操作对于静态和动态方法都是一样的。

进程入队,等待资源就绪

一旦声明并初始化了等待队列,进程就可以使用它进入睡眠状态。有几个宏可用于不同的用途。

struct __wait_queue {
   
	unsigned int flags;
#define WQ_FLAG_EXCLUSIVE	0x01
	struct task_struct * task;
	
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值