Wait_Queue------等待队列的唤醒事件

wake_up()与wait_event()或者wait_event_timeout成对使用,

wake_up_intteruptible()与wait_event_intteruptible()或者wait_event_intteruptible_timeout()成对使用。


在 Linux 中, 一个等待队列由一个"等待队列头"来管理, 一个 wait_queue_head_t 类型的结构, 定义在中. 一个等待队列头可被定义和初始化, 使用:

DECLARE_WAIT_QUEUE_HEAD(name);

或者动态地, 如下:

wait_queue_head_t my_queue;

init_waitqueue_head(&my_queue);


1、简单睡眠:   

Linux 内核中睡眠的最简单方式是一个宏定义, 称为 wait_event(有几个变体); 它结合了处理睡眠的细节和进程在等待的条件的检查. wait_event 的形式是:

wait_event(queue, condition)

wait_event_interruptible(queue, condition)

wait_event_timeout(queue, condition, timeout)

wait_event_interruptible_timeout(queue, condition, timeout)

这些东西如何使用?queue 是等待队列头,condition 是条件,如果调用 wait_event 前 condition == 0 ,则调用 wait_event 之后,当前进程就会休眠


wait_event:

将当前进程的状态设置为 TASK_UNINTERRUPTIBLE  ,然后 schedule()


wait_event_interruptible:       

TASK_INTERRUPTIBLE    ,然后 schedule()


wait_event_timeout:             

TASK_UNINTERRUPTIBLE  ,然后 schedule_timeout()


wait_event_interruptible_timeout:

TASK_INTERRUPTIBLE    , 然后 schedule_timeout()


TASK_INTERRUPTIBLE 与 TASK_UNINTERRUPTIBLE 区别在于:

它的休眠是否会被信号打断,别的进程发来一个信号比如 kill ,TASK_INTERRUPTIBLE 就会醒来去处理。然而 TASK_UNINTERRUPTIBLE 不会。schedule(),进程调度,而schedule_timeout()进行调度之后,一定时间后自动唤醒。


对应于不同的进程状态,使用不同的唤醒函数:

void wake_up(wait_queue_head_t *queue);

void wake_up_interruptible(wait_queue_head_t *queue);

唤醒时很有意思,比如你调用 wake_up 去唤醒一个使用 wait_event 等,进入休眠的进程,唤醒之后,它会判断 condition 是否为真,如果还是假的继续睡眠。


2、手动睡眠:

        DECLARE_WAITQUEUE(name, tsk)  创建一个等待队列:

                        tsk一般为当前进行current. 这个宏定义并初始化一个名为name的等待队列.

        将等待队列头 加入/移除 等待队列:

                      void add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait);

                      void add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t *wait);

                      void remove_wait_queue(wait_queue_head_t *q, wait_queue_t *wait);

        设置进程状态:

                      set_current_state(TASK_INTERRUPTIBLE) 等

        进程调度: 

                      schedule() 或者 schedule_timeout()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,997评论 19 139
  • 看到网上有不少讨论epoll,但大多不够详细准确,以前面试有被问到这个问题。不去更深入的了解,只能停留在知其然...
    电台_Fang阅读 11,958评论 0 8
  • 名称 libev - 一个 C 编写的功能全面的高性能事件循环。 概要 示例程序 关于 libev Libev 是...
    hanpfei阅读 15,411评论 0 5
  • 我:“人生导师大人,谢谢赏赐,好久没吃的这么爽了,一个人两人份” 妹:“那你,你跪安吧” 不对啊,我吃了她心爱的早...
    苗条瘦身阅读 333评论 0 1
  • 看完了七月与安生,真的是哭的不行,不知道为什么,闺蜜情是多么的珍贵,她们两个人虽然从18岁就聚少离多但是好像时...
    在未来徘徊的快乐阅读 207评论 0 0