Select/poll 原理-中断

Select/poll 原理-中断

 

Linux应用程序如果想判断一个设备是否可读可写,可以通过轮询的方式(io操作三种方式轮询,中断,dma),每隔一段时间去访问该设备 判断该设备是否可读可写,如果不行就返回,过一段时间再判断一次。

也可以阻塞时的等待,此时进程就会睡眠。

 

那么当有100个任务想要读写一个设备的时候,如果创建100个进程去阻塞或者轮询这个设备文件也挺夸张的。所以引入了select/poll机制(多路复用机制),只需要创建一个任务,将100个连接的句柄收集起来,传给操作系统,然后静静的等待poll_wait(进程休眠了)。当设备有数据变化时(中断),操作系统会唤醒进程。

这个案例主要用于网络的并发通信上。

 

但是在其他设备上也可以使用,比如gpio中断的使用,应用层如何才能以最低的消耗获取中断信息呢?

驱动层:写一个字符设备,支持poll,注册gpio中断,在gpio中断唤醒poll wait的任务等待队列。

应用层:可以写一个线程poll 设备节点,如果没返回则自动进入睡眠。

 

当中断发生的时候,唤醒poll wait的任务等待队列,此时应用程序就会返回一个状态,表示收到了设备信息。

 

当然,刚才说gpio中断用例也可以使用Input子系统包装(比如gpio key 有现成的驱动程序)。在应用程序中poll(/dev/input/eventx) 即可,原理是一样的。

 

所以select /poll的原理还是利用中断(系统调用也是中断)的方式对任务唤醒,极大的降低了cpu的消耗。

 

驱动中几个关键的函数:

Open:

init_waitqueue_head(&udev->waitq);

 

poll:

poll_wait(file, &udev->waitq, wait);

 

Read/write/其他内核函数:

wake_up_interruptible(&udev->waitq);

 

详细的实现原理可以参考大神的文章:

https://mp.weixin.qq.com/s/4xqJGsjiSxRHdI80OERHmQ 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值