IO分类
- NIO
- NIO即同步非阻塞IO。非阻塞的recvfrom系统调用之后,进程并没有被阻塞,内核马上返回进程,如果数据还没准备好,此时会返回一个error。进程在返回之后,可以干点别的事情,然后再发起recvfrom系统调用。重复上面的过程,循环往复的进行recvform系统调用。这个过程通常被称之为轮询。轮询检查内核数据,直到数据准备好,再拷贝数据到进程,进行数据处理。需要注意,拷贝数据整个过程,进程仍然是属于阻塞的状态。
- 发起recvfrom系统调用后立即返回,之后通过轮询的方法查看数据是否准备就绪;
- 数据准备好后将数据从内核复制到用户进程,阻塞。
- BIO
- BIO即同步阻塞IO。
- 发起recvfrom系统调用,等待数据到达,阻塞;
- 数据准备好将数据从内核复制到用户进程,阻塞。
- Signal Driven IO
- 信号驱动IO。
- Asynchronous IO
- 异步非阻塞IO。
IO多路复用技术
- select
- select会修改传入的参数数组,这个对于一个需要调用很多次的函数,是非常不友好的;
- 任何一个socket准备好数据后都需要遍历一次链表,随着监视的描述符数量的增加,其效率会线性下降;
- 非线程安全,socket加入到select后无法收回,若强行关闭则会出现不可预测的后果;
- poll
- 无最大连接数的限制,从设计上来说,不再修改传入数组;
- 非线程安全,任何一个socket准备好数据后都需要遍历一次链表,随着监视的描述符数量的增加,其效率也会线性下降。
- epoll
- 仅支持linux;
- 涉及epoll_create、epoll_ctl、epoll_wait;
- 工作模式有水平触发和边缘触发。