IO包括数据就绪,数据读写
处理IO时,阻塞非阻塞都是同步IO,除非使用特殊API.
同步:数据读写由应用程序自己完成,异步则由操作系统处理,处理完毕后通知应用程序。
Linux上的五种IO模型
1. 阻塞IO
调用函数后,在函数返回前,什么也不做,只不停检查该函数是否返回,返回后才能进行下一步。
2.非阻塞IO
调用函数后,在函数返回前,每隔一段时间检查该函数是否返回,是否就绪,没有就绪就做其他事。总是立即返回,不管事件是否发生。未发生,返回-1.(EAGAIN,未发生,则反复调用)。
3.IO复用
不像上面的只能检测一个IO事件,IO复用可以同时阻塞多个IO操作,同时对多个读写IO操作检测。直到有数据可读/写,才真正调用IO操作函数。
4.信号驱动
用信号驱动接口进行信号驱动IO,安装一个信号处理函数,进程继续运行,当IO就绪,进程收到SIGIO信号,开始处理IO事件。(多线程处理比较麻烦)
第一个阶段异步,第二个阶段同步。相较于非阻塞IO,避免了不断地轮询,减少了系统API调用次数,效率提高。
多路复用是内核们监听多个文件描述符,阻塞在监听的函数比如select, 拷贝数据也是阻塞的,多路复用只是防止进程在某个io阻塞后,不能及时处理其他io的事件。信号驱动则是先登记信号处理函数,当数据准备完毕后由内核发送信号给进程,让进程处理。信号驱动不阻塞在数据准备过程,但阻塞在数据拷贝,所以两者都是同步IO,
5. 异步IO
调用异步IO接口告诉内核缓冲区指针和缓冲区大小,文件偏移和通知方式,函数立即返回,内核将数据拷贝到用户缓冲区后,再通知应用程序。