干货:Linux内核中等待队列的四个用法

电子说

1.2w人已加入

描述

Linux内核里的等待队列机制在做驱动开发时用的非常多,多用来实现阻塞式访问,下面简单总结了等待队列的四种用法,希望对读者有所帮助。

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

睡眠方式:wait_event, wait_event_interruptible

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

2. 手工休眠方式一:

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

DEFINE_WAIT(my_wait) 《==》 wait_queue_t my_wait; init_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_wait; init_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):

将当前进程无条件休眠在给定的等待队列上,极不赞成使用这个函数,因为它对竞态没有任何保护机制。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分