BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开,每个线程都会有自己的栈内存,会导致内存过大,stackmemryflow,增大cpu线程切换压力。
NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
具体可类比场景为:
BIO:一家餐馆,每来一个客人就专门指派一个服务员为其服务,这样虽然服务质量好了,但是服务员过多,餐厅都挤不下去了,stackmemeryflow,每个客人除了点菜,买单需要服务外,其他用餐时间大部分不需要服务,资源浪费,服务员过多,调度难度大。
NIO:餐馆新增一个前台(selector)服务员,餐桌(selectorkey)安装一个铃,前台安装一个传呼反应器(reactor),客人来人,前台负责登记,客人需要服务,按铃讲需求,前台登记,所有需求服务由前台调度,10个服务员(线程池),有需求了就叫服务员去服务,服务完回到前台待命!
类比到netty:
1.chinel 相当于客户,前台相当于server端的boss,反应器相当于work,放映器上面有对应的每个桌号的接收器,客人来了,boss接收,安排到具体桌位上,并且登记注册到反应器上面(EventLoopGroup),反应器上面的桌号灯接收器启动(EnentLoop),chinel通过按铃这个通道(chinelpiple)进行输入呼叫自己的需求,发出声音,前台(selector)记录下来,安排服务员去服务(ServerChinnel)