阻塞与非阻塞
主要指的是访问 IO 的线程是否会阻塞(或者说是等待)
线程访问资源,该资源是否准备就绪的一种处理方式。
同步和异步
主要是指的数据的请求方式 同步和异步是指访问数据的一种机制
BIO
同步阻塞 IO,Block IO,IO 操作时会阻塞线程,并发处理能力低。
我们熟知的 Socket 编程就是 BIO,一个 socket 连接一个处理线程(这个线程负责这个 Socket 连接的一系列数据 传输操作)。阻塞的原因在于:操作系统允许的线程数量是有限的,多个 socket 申请与服务端建立连接时,服务端 不能提供相应数量的处理线程,没有分配到处理线程的连接就会阻塞等待或被拒绝。
NIO
同步非阻塞 IO,None-Block IO
NIO 是对 BIO 的改进,基于 Reactor 模型。我们知道,一个 socket 连接只有在特点时候才会发生数据传输 IO 操作, 大部分时间这个“数据通道”是空闲的,但还是占用着线程。NIO 作出的改进就是“一个请求一个线程”,在连接到 服务端的众多 socket 中,只有需要进行 IO 操作的才能获取服务端的处理线程进行 IO。这样就不会因为线程不够用 而限制了 socket 的接入。
AIO(
异步非阻塞 IO
这种 IO 模型是由操作系统先完成了客户端请求处理再通知服务器去启动线程进行处理。AIO 也称 NIO2.0,在 JDK7 开始支持。
Netty Reactor 模型 - 单线程模型、多线程模型、主从多线程模型介 绍
用户发起 IO 请求到 Reactor 线程
Ractor 线程将用户的 IO 请求放入到通道,然后再进行后续处理 处理完成后,Reactor 线程重新获得控制权,继续其他客户端的处理
这种模型一个时间点只有一个任务在执行,这个任务执行完了,再去执行下一个任务。
1. 但单线程的 Reactor 模型每一个用户事件都在一个线程中执行: 2. 性能有极限,不能处理成百上千的事件
3. 当负荷达到一定程度时,性能将会下降
4. 某一个事件处理器发生故障,不能继续处理其他事件
Reactor 多线程模型
Reactor 多线程模型是由一组 NIO 线程来处理 IO 操作(之前是单个线程),所以在请求处理上会比上一中模型效率 更高,可以处理更多的客户端请求
这种模式使用多个线程执行多个任务,任务可以同时执行
Reactor 主从多线程模型
这种线程模型是 Netty 推荐使用的线程模型 这种模型适用于高并发场景,一组线程池接收请求,一组线程池处理 IO。