zoukankan      html  css  js  c++  java
  • 等待队列总结


    最近针对等待队列专门来研究一下相关的使用和原理,下面把一些比较重要的东西记录下来,方便以后复习
      
     在Linux驱动程序中,可以使用等待队列(wait queue)来实现阻塞进程的唤醒。wait queue很早就作为一种基本的功能单位出现在Linux内核里了,它以队列位基础数据结构,与进程调度机制紧密结合,能够用于实现内核中异步事件通知机制。等待队列可以用来同步对系统资源的访问。(信号量在内核中也依赖等待队列来实现)。
        Linux-2.6提供如下关于等待队列的操作:
        (1) 定义"等待队列头"
            wait_queue_head_t my_queue;


        (2) 初始化"等待队列头"
            init_waitqueue_head(&my_queue);
            定义和初始化的快捷方式:
            DECLARE_WAIT_QUEUE_HEAD(my_queue);  


        (3) 定义等待队列
            DECLARE_WAITQUEUE(name, tsk);
            定义并初始化一个名为name的等待队列(wait_queue_t);


        (4) 添加/移除等待队列
            void fastcall add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait);
            void fastcall remove_wait_queue(wait_queue_head_t *q, wait_queue_t *wait);
            add_wait_queue()用于将等待队列wait添加到等待队列头q指向的等待队列链表中,而remove_wait_queue()用于将等待队列wait从附属的等待队列头q指向的等待队列链表中移除。


        (5) 等待事件
            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()和wait_event_interruptible()的区别在于后者可以被信号打断,而前者不能。加上timeout后的宏意味着阻塞等待的超时时间,以jiffy为单位,在第三个参数的timeout到达时,不论condition是否满足,均返回。


        (6) 唤醒队列
            void wake_up(wait_queue_head_t *queue);
            void wake_up_interruptible(wait_queue_head_t *queue);
            上述操作会唤醒以queue作为等待队列头的所有等待队列对应的进程。
            wake_up()               <--->    wait_event()
                                             wait_event_timeout()
            wake_up_interruptible() <--->    wait_event_interruptible()  
                                             wait_event_interruptible_timeout()

            wake_up()可以唤醒处于TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE的进程
            wake_up_interruptble()只能唤醒处于TASK_INTERRUPTIBLE的进程。


        (7) 在等待队列上睡眠
            sleep_on(wait_queue_head_t *q);
            interruptible_sleep_on(wait_queue_head_t *q);
         
            sleep_on()函数的作用就是将当前进程的状态置成TASK_UNINTERRUPTIBLE,定义一个等待队列,并把它添加到等待队列头q,直到支援获得,q引导的等待队列被唤醒。
            interruptible_sleep_on()与sleep_on()函数类似,其作用是将目前进程的状态置成TASK_INTERRUPTIBLE,并定义一个等待队列,之后把它附属到等待队列头q,直到资源可获得,q引导的等待队列被唤醒或者进程收到信号。  

            sleep_on()               <--->   wake_up()
            interruptible_sleep_on() <--->   wake_up_interruptible()
       
  • 相关阅读:
    技术周刊 · 耿耿星河欲曙天 | SpaceX 上的前端架构;跨平台新选择;开源世界的新“大门”;用户推荐算法的敲门砖……
    说说SVG的feTurbulence滤镜
    机器学习进阶
    小程序与动画的故事
    技术周刊 · 迢迢山径峻 | Web 开发成长图谱;下一代前端构建技术;AI 应用下支离破碎的真实;不懂产品不会开发;虚拟货币是新时代的黄金
    从中断机制看 React Fiber 技术
    三分钟了解数字人民币
    凹凸技术揭秘:如何服务 toG 项目——数字人民币项目前端总结
    使用 Phaser3+Matter.js 实现“合成大西瓜”游戏
    痞子衡嵌入式:快速定位i.MXRT600板级设计ISP[2:0]启动模式引脚上电时序问题的方法
  • 原文地址:https://www.cnblogs.com/yuzaipiaofei/p/4124207.html
Copyright © 2011-2022 走看看