同步阻塞io
默认情况下所有的socket都是阻塞的.
在这个IO模型中,用户空间的应用程序执行一个系统调用(recvform),这会导致应用程序阻塞,什么也不干,直到数据准备好,并且将数据从内核复制到用户进程,最后进程再处理数据
同步非阻塞
同步非阻塞就是 “每隔一会儿瞄一眼进度条” 的轮询(polling)方式,设备是以非阻塞的形式打开的,意味着 IO 操作不会立即完成,read 操作可能会返回一个错误代码
在网络IO时候,非阻塞IO也会进行recvform系统调用,检查数据是否准备好,与阻塞IO不一样,“非阻塞将大的整片时间的阻塞分成N多的小的阻塞, 所以进程不断地有机会 ‘被’ CPU光顾”。
也就是说非阻塞的recvform系统调用调用之后,进程并没有被阻塞,内核马上返回给进程,如果数据还没准备好,此时会返回一个error,返回值后,可以继续干点别的事情,然后再发起recvform系统调用,重复直到数据准备好,拷贝数据整个过程,进程仍然是属于阻塞的状态
io多路复用
elect轮询相对非阻塞的轮询的区别在于----前者可以等待多个socket,能实现同时对多个IO端口进行监听
信号驱动式io
允许Socket进行信号驱动IO,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。
异步非阻塞io
用户进程进行aio_read系统调用之后,无论内核数据是否准备好,都会直接返回给用户进程,然后用户态进程可以去做别的事情,IO两个阶段,进程都是非阻塞的
异步阻塞
业务逻辑需要的是做完一件事后做另一件事,这样的业务逻辑就需要调用者是以阻塞方式来工作
另外一种使用阻塞方式的理由是降低响应延迟
对实时系统或者延迟敏感的事务,有时采用阻塞方式比非阻塞方式更好
比较
除了异步io之外,所有的io模型都会在复制数据到用户空间时阻塞