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收集发生事件的连接
收藏文章数量从多到少与“把书读薄”是一个道理