zoukankan      html  css  js  c++  java
  • 非阻塞I/O和阻塞I/O

    1.简介

      等待队列实现在事件上的条件等待:希望等待特定事件的进程把自己放进合适的等待队列,并放弃控制权。可用于:

      - 中断处理

      - 进程同步

      - 定时

    2.等待队列头数据结构

    1 typedef struct _wait_queue_head{
    2     spinlock_t lock;
    3     struct list_head task_list;      
    4 } wait_queue_head_t;

    3.进程状态

      - TASK_TUNNING:可运行状态

      - TASK_INTERRUPTIBLE:可中断睡眠状态

      - TASK_UNINTERRUPTIBLE:不可中断睡眠

      - TASK_ZOMBLE:僵尸状态:表示进程结束且已释放资源,但task_struct仍未释放

      - TASK_STOPPED:暂停状态。处于该状态的进程通过其他进程的信号才能被唤醒

    4.独占等待

      当wake_up被在一个等待队列上调用时,它在唤醒一个有WQ_FLAG_EXCLUSIVE标志的进程后停止唤醒,但内核仍然每次唤醒所有的非独占等待

      使一个进程进入独占等待,调用如下函数

      void prepare_to_wait_exclusive(wait_queue_head_t *queue, wait_queue_t *wait, int state)

    5.等待队列相关API

      - DECLARE_WIT_QUEUE_HEAD(name):定义一个等待队列头,名字为name,类型wait_queue_head_t

      - init_waitqueue_head(q):动态初始化一个等待队列头

      - wait_event(wq, condition):在等待队列中睡眠,直到condition为真,等待期间,进程状态被设置为TASK_UNINTERRUPTIBLE

      - wait_event_interruptible(wq, condition):同上,等待期间,进程状态被设置为TASK_INSTERRUPTIBLE,若被信号唤醒,则返回-ERESTARTSYS错误码,否则返回0

      - wait_event_timeout(wq, condition, timeout):类似wait_event,当超过timeout时间后,返回0

      - wait_event_interruptible(wq, condition, timeout):同上,若在睡眠期间被信号打断,则返回-ERESTARTSYS错误码

      - wake_up(x):唤醒等待队列,x为要唤醒的队列头指针

      - wake_up_interruptible(x):唯一区别是只能唤醒TASK_INTERRUPTIBLE状态的进程

      - wake_up_interruptible_all(x):

      - wake_up_all(x):唤醒所有进程,不管是否进行独占等待

      - wake_up_nr(x, nr):唤醒等待队列上的nr个独占进程,和wake_up_all的区别在于这个宏可能唤醒nr个独占等待进程,而wake_up_all只能唤醒一个独占等待进程

    6.阻塞概念:

      - 阻塞:指在执行设备操作时若不能获得资源则挂起操作,知道满足可操作的条件后再进行

      - 非阻塞:进程在不能进行设备操作时并不挂起,它或者放弃,或者不停的查询,直到可以进行操作

    7.在设备驱动中实现阻塞功能:

      - wait_queue_head_t myqueue:定义等待队列头

      - init_waitqueue_head(&my_queue):初始化队列头

      - add_wait_queue:添加等待队列

      - remove_wait_queue:删除等待队列

      - 等待事件:

        * wait_event

        * wait_event_interruptible

        * wait_event_timeout

        * wait_event_interrruptible_timeout

      - 唤醒事件

        * wake_up

        * wake_up_interruptible

      - 把进程在队列上休眠

        * sleep_on

        * interruptible_sleep_on

    8.使用非阻塞I/O的应用程序通常会使用select()和poll()系统调用查询是否可对设备进行无阻塞访问。select和poll系统调用最终会引发设备驱动中的poll函数被执行

      

  • 相关阅读:
    从新浪财经获取金融新闻类数据并进行打分计算
    SQL窗口函数的用法总结
    从新浪财经获取金融新闻类数据并保存到MySQL
    [ZJOI2015]幻想乡战略游戏
    二次剩余入门
    [多校赛20210406]迫害 DJ
    [NOI Online 2021 提高组] 愤怒的小N
    [NOI Online 2021 提高组] 岛屿探险
    「UNR #3」百鸽笼
    [ZJOI2019]开关
  • 原文地址:https://www.cnblogs.com/Mr-ox/p/6408895.html
Copyright © 2011-2022 走看看