一、NIO的三大组件
1.1 Channel
常见的Channel有:
- FileChannel -- 文件传输通道
- DatagramChannel -- UDP数据传输通道
- SocketChannel -- TCP数据传输通道(客户端,服务器端通用)
- ServerSocketChannel -- TCP数据传输通道(专用于服务器端)
1.2 Buffer
常见的Buffer:
只有ByteBuffer最常用,是一个抽象类。实现类有三个,如下图所示
1.3 Selector
服务器设计 - 多线程
形象解释:将服务器想象是个饭店,socket是一个客人,thread是一个服务员。每来一个客人,就要安排一个服务员跟着。
内存占用高:每维护一个线程,都要消耗内存
线程上下文切换成本高:CPU如果只有16核,那最多只能有16个线程在跑。其余线程就搞挂起,保存下该线程的运行情况。等CPU时间片轮到它,再load上下文回去。
服务器设计 - 线程池
形象解释:将服务器想象是个饭店,socket是一个客人,thread是一个服务员。在阻塞模式下,一个客人来了,哪怕这个客人啥都不干,一个服务员就要干等在那里,不能处理其他客人的请求。。。
老式服务器大多此设计,处理HTTP 请求
服务器设计 - selector
形象解释:将服务器想象是个饭店,channel是一个客人,thread是一个服务员。selector可以监视多个客人的动作。一旦哪个客人有动作(要和服务器交互),selector就会感知到,通知服务员thread来处理。
豁然开朗,之前以为非阻塞的实现是因为selector,现在才知道selector的为了让非阻塞变成更好:
- 无事件时,阻塞
- 有事件时,非阻塞