解析Linux等待队列的运用(linux等待队列的使用)
Linux作为一种操作系统,等待队列机制在内核中发挥着非常重要的作用。比如,在处理临界区的访问,需要实现消息循环,消息队列管理异步事件等情况,都需要用到等待队列。其工作方式是,当发生请求时,会根据状态和目的地址,将请求加入等待队列中,等待cpu执行。
下面,我们就以Linux系统为例,来介绍一下等待队列的运用。首先,要了解等待队列,需要分析和理解内核操作系统中的代码,下面以一段核心模块的常用函数__wait_on_bit()为例,介绍一下它的运用和实现的步骤:
void __wait_on_bit(struct wait_queue_head *wq, struct wait_queue_entry *wq_entry,int (*action)(struct wait_queue_entry *))
{ struct wait_queue *wait;
signed long timeout;
//注册要等待的wait queue wait = prepare_to_wait_exclusive(wq, wq_entry, TASK_UNINTERRUPTIBLE);
timeout = MAX_SCHEDULE_TIMEOUT;
//释放wq->lock锁 smp_mb();
//等待队列条件满足
while (!(*action)(wq_entry)) { timeout = io_schedule_timeout(timeout);
wait_io_event_timeout(wq_entry, timeout); //重新获得wq->lock
smp_mb(); if (signal_pending_state(TASK_UNINTERRUPTIBLE, wq_entry->private))
break; }
//结束wait并获取wq->lock finish_wait(wq, wait);
}
这段代码的框架如下:首先,需要注册一个进入等待的队列wait,随后会获取超时时间timeout,然后释放锁wq->lock,同时检查等待条件是否满足。如果满足,则调用io_schedule_timeout()方法进行超时处理;如果不满足,通过wait_io_event_timeout()方法进行等待,直到条件满足时才结束等待。最后,重新获得wq->lock,等待结束。
以上,就是Linux等待队列的运用,从而实现临界区的处理,信号的传递以及消息的处理等功能。其中,需要特别注意的是,wait中的队列,在进行wait_io_event_timeout()操作前,要保证能够获得可执行的lock,以保证在等待过程中的安全性。