在Linux驱动程序中,使用等待队列的作用?

在Linux驱动程序中,使用等待队列的作用?,第1张

我帮你搜索到如下的回复希望对你有帮助《Linux就该这么学》

概念与术语

1内核里面的一个队列,可以将对象加入到队列中,

2可以选择条件休眠和无条件休眠,一般情况下是条件休眠用得较多。

3作用:阻塞读。当运用程序读数据但是现在还无数据可读时,往往会先挂起,

4让其他线程先走,等有数据可读时再唤醒。

5那么什么时候唤醒呢?怎样唤醒呢?

6这里等待队列就派上用场了。读的时候若无数据可读则加入到等待队列中,

7写入的时候唤醒这个队列。

8可以类比运用程序编程中的pthread_cond_wait()与pthread_cond_broadcast()记忆。

函数接口

include/linux/wait.h

1. 睡眠等待某个条件发生(条件为假时睡眠):

睡眠方式:wait_event, wait_event_interruptible

唤醒方式:wake_up (唤醒时要检测条件是否为真,如果还为假则继续睡眠,唤醒前一定要把条件变为真)

2. 手工休眠方式一:

1)建立并初始化一个等待队列项

DEFINE_WAIT(my_wait) <== wait_queue_t my_waitinit_wait(&my_wait)

2)将等待队列项添加到等待队列头中,并设置进程的状态

prepare_to_wait(wait_queue_head_t *queue, wait_queue_t *wait, int state)

3)调用schedule(),告诉内核调度别的进程运行

4)schedule返回,完成后续清理工作

finish_wait()

3. 手工休眠方式二:

1)建立并初始化一个等待队列项:

DEFINE_WAIT(my_wait) <== wait_queue_t my_waitinit_wait(&my_wait)

2)将等待队列项添加到等待队列头中:

add_wait_queue

3)设置进程状态

__set_current_status(TASK_INTERRUPTIBLE)

4)schedule()

5)将等待队列项从等待队列中移除

remove_wait_queue()

其实,这种休眠方式相当于把手工休眠方式一中的第二步prepare_to_wait拆成两步做了,即prepare_to_wait <====add_wait_queue + __set_current_status,其他都是一样的。

4. 老版本的睡眠函数sleep_on(wait_queue_head_t *queue):


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8390088.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-16
下一篇 2023-04-16

发表评论

登录后才能评论

评论列表(0条)

保存