进程读取数据时要通过两个阶段:异步
1.等待内核准备数据;socket
2.将内核缓冲区中的数据复制到进程缓冲区中。spa
1、阻塞IO对象
进程会阻塞在等待内核准备数据和数据从内核空间复制到用户空间这两个阶段。blog
2、非阻塞IO进程
进程读取数据时,若是内核数据尚未准备好,则会当即返回一个错误告诉进程数据还没准备好。因此程序必须不断轮询询问内核数据到底准备好了没。事件
当内核准备好数据后,此模式仍是会阻塞在从内核复制数据到用户空间的过程当中,因此此模式仍是属于同步IO。同步
3、IO多路复用select
监听多个IO对象,当对象上有事件发生时,通知进程。例如select,epoll。程序
以select为例,用户进程会阻塞在select调用上,等待有哪些socket变成可读状态(此阶段属于内核数据准备阶段,即等待网卡获取到数据)。
当有socket变为可读状态后,用户调用recvfrom,又会阻塞在复制内核数据到进程的过程当中。
因此多路复用模式的优点不是比阻塞IO处理单链接更快,而是可以在单进程中处理更多的链接。
4、异步IO(上面三个均属于同步IO)
用户调用异步读取后当即返回,而后能够去作其余工做,当内核数据准备好,而且将数据从内核空间复制到用户空间后会发出信号通知进程处理。