阻塞、非阻塞IO、异步通知的区别

参考:Linux设备驱动开发详解 --宋宝华

一:它们在时间上先后顺序不同:

  1.阻塞IO首先是发起读写IO操作,然后系统会调用读写IO的函数,内核在调度这个读写操作任务时会检查资源是否可获得,由于是阻塞IO,所以系统的任务调度会一直等待(阻塞)在这里(当然,2.6是可抢占内核,不会让这个程序这么霸道的占着CPU不放手)。当资源可用时就开始执行IO读写操作,然后返回给调用处(用户空间)。

  2.非阻塞IO则首先是用poll或select这类的函数来达到“非等待”的效果,如果你不知道这两个函数是干嘛的,请点击 pollselect。简单点来说,就是它检查一些函数或中断的资源是否可以获得,如何不能就立即返回,然后再去干别的事,当然,系统中的某些函数还是在一直执行来扫描这些函数或中断的资源是否可获得,只要获得了资源就立即唤醒一直在系统中默默在扫描的函数,然后这个函数再给poll或select一个提醒:那些函数或中断准备好了。此时主程序就开始执行你所需要的读写IO的操作了。

  3.异步通知首先就等待中断资源可获得的通知,如果主程序没有收到通知则干别的,突然,它收到了这个通知,然后它就按照预先的约定去执行指定的读写IO的函数(内核空间),然后就返回一个信号给主程序(用户)说操作完成。

  阻塞、非阻塞IO、异步通知本身没有优劣之分,关键是你如何运用。

原文地址:https://www.cnblogs.com/yinsua/p/3225825.html