传统IO请求等待主要在1.等待数据就绪 2.将数据从内核缓冲区到用户进程缓冲区互相拷贝过程
传统一连接一线程 请求多的时候服务端需要开辟很多线程消耗资源 最主要的这些消耗并不是都消耗在业务逻辑的执行上面 好多在io等待上面 (通过visualvm监控服务后台可以看出很多都是wait状态) 这个等待的过程是阻塞的,直到完成为止。
那么是不是可以将这些等待利用起来 让一个线程去等呢?如果有了这样一个线程去等待 那么大量请求过来是不是服务端就不需要开辟那么多线程呢?
NIO出现主要就是为了解决这件事情的。
NIO+REACTOR模式 基于事件机制: 这个时候读写就不再是阻塞的了 之前每个线程的操作都是固定的 读 执行 写 线程按照这个顺序去做事 读和写都必须等,等到真正的数据到来 可读取 可写入为止。时间就消耗在这里。
NIO有个专门的线程去等可读取可写入 等到时机到了 通过事件通知你去做事情 这样你的线程就没有去等待,都是用来的执行的,利用率非常高,利用率高 相对线程数可以少了。
具体如何通知:
最常见的
1.在启动的时候注册 Connect事件处理器到REACTOR
2.Connect连接事件来了 REACTOR调用到我的Connect执行处理器里面 在里面我可以注册个读取事件等待读事件发生。
3.可读时间发生后 REACTOR会调用读取处理器 处理完读取业务逻辑注册写事件
4.写事件发生了 REACTOR会调用写处理器 写入流。
这个过程中所有IO的等待都在REACTOR里面 如果REACTOR是一个线程的话 那么就消耗一个线程而已。
REACTOR读写具体发生了什么事情:
REACTOR读写时非阻塞的不能读取或者写入的时候可以去监视其他的IO这样单线程 扫描所有的IO就成了可能。
非阻塞让一切变得可能。 马上就是十一假期了。。。。。。。。。。。。。。。。。大家节日快乐