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

  

最新文章

  1. PHP中的数据库三、redis
  2. NGINX + LUA实现复杂的控制 --源自http://outofmemory.cn/code-snippet/14396/nginx-and-lua
  3. 【读书笔记】读《JavaScript模式》 - 函数复用模式之现代继承模式
  4. js用正则表达式控制价格输入
  5. py零散知识点
  6. 3240: [Noi2013]矩阵游戏
  7. mvn开发可执行的java程序
  8. 【HDOJ】2589 正方形划分
  9. javascript绑定事件
  10. Lorenzo Von Matterhorn
  11. iOS安全攻防之代码混淆
  12. javascript 事件基础
  13. C# 启动 SQL Server 服务
  14. 【java集合系列】---HashSet
  15. oracle锁表与解表
  16. Entity Framework (EF) Core工具创建一对多和多对多的关系
  17. 2018-2019-2 20165232 《网络对抗技术》 Exp6 信息搜集与漏洞扫描
  18. Go Lang
  19. IOS 生成静态库文件(.a文件)
  20. Fedora 23+CUDA 8.0+ GTX970 安装

热门文章

  1. Vue官方文档Vue.extend、Vue.component、createElement、$attrs/$listeners、插槽的深入理解
  2. 干货 | 45张图庖丁解牛18种Queue,你知道几种?
  3. pycharm可以运行但无法debug的解决方法
  4. jackson读取json tree讲解
  5. Git——从安装到连接GitHub
  6. C#的TextBox的四种禁止编辑方法
  7. centos7在线yum安装jumpsever2.2.2
  8. java面试题0004-在一个类上是否可以用abstract和final同时加以修饰?
  9. TP6.0 一对一模型关联 hasOne
  10. linux中root用户查看所有用户的历史操作命令