4.阻塞,非阻塞和异步通知

本文探讨了驱动中的三种主要操作方式:阻塞、非阻塞和异步通知。阻塞方式通过等待队列实现,当资源不满足条件时将进程睡眠,待条件满足时唤醒。非阻塞方式则涉及不同的函数调用关系和实现细节。异步通知允许在不阻塞进程的情况下进行事件处理,同样包括应用和驱动的编写方法。
摘要由CSDN通过智能技术生成

1. 驱动中阻塞和非阻塞,异步通知
	
	  ----------
	  |        |                  --------
	  |  进程   |  <-------------->| 设备 |
	  |        |                  --------
	  ----------
	
   阻塞:     进程等待设备资源可用, 等待过程中, 进程休眠(CPU切换去执行别的进程)。 
   非阻塞:   不等待,轮询设备 
   异步通知: 让设备主动去通知进程。
   
   
   注: 提出阻塞,非阻塞,异步通知概念,这里是为了解决资源未准备好时, 进程和设备间是如何打交道的
1.1 阻塞方式
  • 如何在驱动中实现阻塞I/O?
      当有多个进程阻塞睡眠时,可用排队的方式,当造成阻塞的条件消失(如有资源释放了),去唤醒阻塞在排队的进程.
  • 什么叫等待队列?
      以队列为基础数据结构,与进程调度机制紧密结合,能够用于实现内核中的异步事件通知机制,同步对系统资源的访问。
      
    如:
        当某进程不满足某条件时(如资源), 可把进程暂时睡眠,放入队列中,
         等条件满足时(如某资源被释放出来了),再把进程唤醒去执行
    • 如何使用等待队列在驱动中实现阻塞?

      #include <linux/sched.h>
      static wait_queue_head_t queue;   //定义等待队列
      static int condition=0;			//定义等待条件
      
      wait_event_interruptible(queue, condition!=0); //在等待队列上检测是否需等待
      
      wake_up_interruptible(&queue);  //唤醒在queue等待队列上等待的所有进程
      
1.2 非阻塞方式
1.2.1 函数调用关系
应用:
	用select/poll       // I/O多路复用 
驱动:
	实现.poll 函数。 
 ----------------------------
  | 应用                    	|
  |         select/poll    	|
  ---------------------------
               |
  ---------------------------
  |内核     sys_poll       	|	//poll系统调用,轮询poll_table中的驱动.poll, 当设备可读或可写则返回
  |            |            |
  |          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值