java NIO介绍

非阻塞网络调用可以使得我们可以不必等待一个操作的完成。

NIO选择器可以使得我们使用较少的线程监听许多连接上的事件,减少了内存管理和cpu上下文切换所带来的开销。

IO多路服用包括selector、poll、epoll、kqueue等

1、select

  使用数组保存poll中注册的事件,单个进程能够监听的套接字有最大数量限制,1024

  每次收集事件时,需要把全部连接的套接字传给操作系统(用户态到内核态的大量复制),而由操作系统寻找这些连接上是否有未处理的事件,会造成很大的资源浪费。

  它使用了事件通知API以确定在一组非阻塞套接字中有哪些已经就绪能够进行IO相关的操作。

  因为可以在任何的时间检查任意读写操作的完成状态,所以一个单一的线程便可以处理多个并发的连接。

2、poll

   使用数组保存poll中注册的事件,没有套接字限制,因为使用动态分配的数据结构来存储套接字。

  每次收集事件时,需要把全部连接的套接字传给操作系统(用户态到内核态的大量复制),而由操作系统寻找这些连接上是否有未处理的事件,会造成很大的资源浪费。

3、epoll

  使用红黑树存储所有添加到epoll中的事件

  使用双向链表保存将要通过epoll_wait返回给用户的、满足要求的事件

  epoll在linux内核中申请一个简易的文件系统,把原先的select或者poll调用分为三个部分:

  • 调用epoll_create创建一个epoll对象
  • 调用epoll_ctl向epoll对象中添加许多个连接的套接字
  • 调用epoll_wait收集发生事件的连接

 

posted @ 2024-05-05 23:37  使用D  阅读(2)  评论(0编辑  收藏  举报