Linux驱动 下的 阻塞与非阻塞 I/O 学习笔记(一) 之 简介

1、是什么:

        阻塞、非阻塞I/O 是Linux中我们访问 设备时的两种方式,比如访问存储设备硬盘、SD卡等等,要么阻塞访问,要么非阻塞访问   。是非0即1的关系

        I/O 我们可以理解为Input  Output,当然就是数据进数据出,数据写入和读取等等类似的状态了。

2、又是什么:(其实应该是为什么)

     二者的区分依据:

访问一种设备或者资源时,当这种设备或资源不可以马上访问或者获得时

(比如设备被别的进程所占用,啥是进程,实际上就是应用程序在底层的一种说法,我们也可以理解为设备或资源正在被别的应用程序操作),

该进程会不会挂起休眠。


    如果这个访问的设备或者资源的操作想要一直到这个设备或资源可用(可以理解为被别的进程释放掉)时,那么这就是阻塞访问,进程如果是阻塞的,就会被挂起,进入睡眠状态,会被系统的调度器从当前的运行队列中移走,如果设备或资源可用了,一般情况下,会产生一个中断,从而唤醒这个睡着的进程,从而这个进程就获取到了这个设备或资源

    如果这个访问设备或资源的操作发现这个设备或者资源当前不可用,就马上返回,继续执行下一步的操作,下一步的操作可能是放弃访问这个设备或者资源,去进行别的一些操作,也可能是继续访问这个设备或资源,当然,如果设备或资源还是不可用,他又返回了,这样会一直循环下去,这样这个进程永远都是处于活动状态,


3、怎么样

    对应于 阻塞 和  非阻塞  Linux有不同的处理方法

    阻塞 ,通过队列实现 ,在驱动程序中给这个队列起了个名字叫做  等待队列  

   非阻塞,在用户程序中使用 poll ()和select ()系统调用 查询是否可对设备进行非阻塞方式的访问。此外还有扩展的poll()函数,epoll()

  也就是说  凡是用等待队列实现的,都是阻塞访问的,  凡是使用select()、poll()、epoll() 访问设备的,都是非阻塞访问。

    

猜你喜欢

转载自blog.csdn.net/Behold1942/article/details/80270765