现在的位置: 首页 > 综合 > 正文

Linux内核中等待队列的几种用法_zzhere2007

2018年02月07日 ⁄ 综合 ⁄ 共 844字 ⁄ 字号 评论关闭

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):

   不推荐

抱歉!评论已关闭.