IO多路复用实现方式

IO分类

  1. NIO
  • NIO即同步非阻塞IO。非阻塞的recvfrom系统调用之后,进程并没有被阻塞,内核马上返回进程,如果数据还没准备好,此时会返回一个error。进程在返回之后,可以干点别的事情,然后再发起recvfrom系统调用。重复上面的过程,循环往复的进行recvform系统调用。这个过程通常被称之为轮询。轮询检查内核数据,直到数据准备好,再拷贝数据到进程,进行数据处理。需要注意,拷贝数据整个过程,进程仍然是属于阻塞的状态。
  • 发起recvfrom系统调用后立即返回,之后通过轮询的方法查看数据是否准备就绪;
  • 数据准备好后将数据从内核复制到用户进程,阻塞。
  1. BIO
  • BIO即同步阻塞IO。
  • 发起recvfrom系统调用,等待数据到达,阻塞;
  • 数据准备好将数据从内核复制到用户进程,阻塞。
  1. Signal Driven IO
  • 信号驱动IO。
  1. Asynchronous IO
  • 异步非阻塞IO。

IO多路复用技术

  1. select
  • select会修改传入的参数数组,这个对于一个需要调用很多次的函数,是非常不友好的;
  • 任何一个socket准备好数据后都需要遍历一次链表,随着监视的描述符数量的增加,其效率会线性下降;
  • 非线程安全,socket加入到select后无法收回,若强行关闭则会出现不可预测的后果;
  1. poll
  • 无最大连接数的限制,从设计上来说,不再修改传入数组;
  • 非线程安全,任何一个socket准备好数据后都需要遍历一次链表,随着监视的描述符数量的增加,其效率也会线性下降。
  1. epoll
  • 仅支持linux;
  • 涉及epoll_create、epoll_ctl、epoll_wait;
  • 工作模式有水平触发和边缘触发。

Gitee企业版专属

Gitee企业版

你可能感兴趣的:(#,IO,java)