服务器添加网站,网站建设的关键问题,wordpress登录后台太慢,广州 美容 公司 网站建设文章目录 概述Channel BufferSelector服务器设计历史演化多线程版设计线程池版设计selector 版设计 概述
NIO的意思是 non-blocking io 非阻塞 IO 。NIO中存在3大组件#xff1a;Channel 、 Buffer 、Selector
Channel Buffer
channel #xff08;中文 管道的… 文章目录 概述Channel BufferSelector服务器设计历史演化多线程版设计线程池版设计selector 版设计 概述
NIO的意思是 non-blocking io 非阻塞 IO 。NIO中存在3大组件Channel 、 Buffer 、Selector
Channel Buffer
channel 中文 管道的意思有一点类似于 stream它就是读写数据的双向通道可以从 channel 将数据读入 buffer中文 缓冲区的意思也可以将 buffer 的数据写入 channel而之前的 stream 要么是输入要么是输出channel 比 stream 更为底层。Channel和Buffer是多对多的关系它们相互协作共同完成数据的传输和处理任务。 常见的 Channel 有
FileChannel 文件管道不支持非阻塞DatagramChannelSocketChannel 网络管道支持非阻塞ServerSocketChannel 服务端网络管道支持非阻塞
buffer 则用来缓冲读写数据常见的 buffer 有
ByteBuffer MappedByteBufferDirectByteBufferHeapByteBuffer ShortBufferIntBufferLongBufferFloatBufferDoubleBufferCharBuffer
Selector
selector 中文就是选择器的意思单从字面意思不好理解需要结合服务器的设计演化来理解它的用途。服务器的设计演化从多线程-线程池selector
服务器设计历史演化
多线程版设计 在多线程版本下一个请求到达服务端服务端开辟一个线程去处理该请求这种做法在请求量不多的情况下可以接受但是一旦请求量多了那么问题随之而来内存占用高、线程上下文切换成本高这些问题会让你的服务器最终崩溃。
线程池版设计 在线程池版本下服务器会初始化一个线程池池内会有一定量的线程当请求达到服务器时会使用线程池内的线程进行处理处理完归还给线程池。这种模式下虽然避免了服务器不停地创建线程、销毁线程但是仍然存在问题线程仅能处理一个 socket 连接当处理某个socket时线程就会阻塞等待处理完成才能继续处理其他任务。
selector 版设计 在selector 模式下当一个请求到达服务器时会先和channel进行关联由selector来管理这些channel什么时候提交给线程处理。这些 channel 工作在非阻塞模式下有了selector就不会让线程吊死在一个 channel 上。适合连接数特别多但流量低的场景。调用 selector 的 select() 会阻塞直到 channel 发生了读写就绪事件这些事件发生select 方法就会返回这些事件交给 thread 来处理。