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函数被执行

      

  • 相关阅读:
    POJ 3140 Contestants Division (树dp)
    POJ 3107 Godfather (树重心)
    POJ 1655 Balancing Act (树的重心)
    HDU 3534 Tree (经典树形dp)
    HDU 1561 The more, The Better (树形dp)
    HDU 1011 Starship Troopers (树dp)
    Light oj 1085
    Light oj 1013
    Light oj 1134
    FZU 2224 An exciting GCD problem(GCD种类预处理+树状数组维护)同hdu5869
  • 原文地址:https://www.cnblogs.com/Mr-ox/p/6408895.html
Copyright © 2011-2022 走看看