阻塞IO 一个IO一个进程(线程),消耗资源,适用于并发量小的场景,请求IO要阻塞在那里,不占用cpu资源,缺点:不适用并发量大的应用:因为一个请求IO会阻塞进程,所以得为每个请求进程分配一个处理进程(线程)以及时响应,系统开销大。
非阻塞IO 请求IO不阻塞,它处于忙轮循状态,消耗CPU资源
IO复用 select、poll、epoll三种方案,只有一个被注册的进程,在它里面没有注册的进程在IO时被阻塞,select和poll是O(n)的时间复杂度且当注册的IO进程有数据时就线性查,epoll是红黑树o(logn)且采用O(1)的回调方式。不用为每个请求IO都分配处理进程,被注册进程(select,poll或者epoll)可以自己或通知或生成对应的另外的处理进程来再次发起读取IO,读取内核中准备好的数据。
适用高并发服务应用开发:一个进程(线程)响应多个请求;
信号IO 当进程发起一个IO操作,会向内核注册一个信号处理函数,然后请求IO进程返回不阻塞;当内核数据就绪时会发送一个信号给请求IO进程,请求IO进程便在信号处理函数中调用IO读取数据。 由于不阻塞同样消耗cpu资源。
异步IO 当进程发起一个IO操作,进程返回(不阻塞),但也不能返回果结果;内核把整个IO处理完后,会通知进程结果。如果IO操作成功则进程直接获取到数据。