nio关键是selector(多路复用器)
Selector类是NIO的核心类,Selector能够检测多个注册的通道上是否有事件发生,如果有事件发生,便获取事件然后针对每个事件进行相应的响应处理。这样一来,只是用一个单线程就可以管理多个通道,也就是管理多个连接。这样使得只有在连接真正有读写事件发生时,才会调用函数来进行读写,就大大地减少了系统开销,并且不必为每个连接都创建一个线程,不用去维护多个线程,并且避免了多线程之间的上下文切换导致的开销。
与Selector有关的一个关键类是SelectionKey,一个SelectionKey表示一个到达的事件,这2个类构成了服务端处理业务的关键逻辑。 
epoll原理
三个关键函数
epollCreat
创建一个epoll实例,并返回一个非负数作为文件描述符(Linux系统一切皆文件)

epollCtl
会调用Linux操作系统EPOLL_CTL
调用EPOLL_CTL才会真真监听evnt事件

epollWait
slector内部有两个集合
- 就绪事件列表rdlist
- channel集合
 1.注册调register会把socketchannel和serverSocketChannel放到channel集合 epollWait会监听就绪事件集合,有事件就不会阻塞,集合为空时就会阻塞等着
2.操作系统能通过中断感知客户端连接,收发数据,由操作系统把事件放到就绪事件列表,
select,poll和epoll区别
select会遍历所有的socketChannnel poll和select差不多,只是最大连接数有没有限制 
|