Netty详解(一)IO基本概念

1. 阻塞与非阻塞

阻塞 IO:阻塞 IO 是指调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会返回

非阻塞 IO:非阻塞 IO 是指在不能立刻得到结果之前,该调用不会阻塞当前线程

2. 同步和异步

同步和异步是指访问数据的一种机制

同步请求

  • 同步I/O操作是指在执行I/O操作时,程序必须等待操作完成才能继续执行。在同步操作中,程序提交一个I/O请求后,操作系统会阻塞该程序,直到请求操作完成。此时,程序才能继续执行后续的代码。因此,同步操作会导致程序执行流程暂停,直至I/O操作完成。

异步请求

  • 异步I/O操作是指程序在发起I/O请求后,无需等待操作完成,可以继续执行其他任务。当异步I/O操作完成时,程序会通过某种方式(如回调函数、事件通知、信号等)得到通知。因此,异步操作使程序执行流程得以继续,而不必等待I/O操作完成。

3. BIO 和 NIO

BIO

  • BIO 就是传统的 java.io 包,它是基于流模型实现的,交互的方式是同步、阻塞方式,也就是 说在读入输入流或者输出流时,在读写动作完成之前,线程会一直阻塞在那里,它们之间的调 用时可靠的线性顺序。它的有点就是代码比较简单、直观;缺点就是 IO 的效率和扩展性很 低,容易成为应用性能瓶颈。

BIO 的 Server 的通讯模型

NIO

  • NIO 是一种同步非阻塞的 I/O 模型,于 Java 1.4 中引入,对应 java.nio 包,提供了 Channel , Selector,Buffer 等抽象。NIO 中的 N 可以理解为 Non-blocking,不单纯是 New。它支持面向缓冲的,基于通道的 I/O 操作方法。 NIO 提供了与传统 BIO 模型中的 Socket 和 ServerSocket 相对应的 SocketChannel 和 ServerSocketChannel 两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发

NIO 的 Server 的通讯模型

生活实例来进行理解

  • BIO:去吃饭发现全坐满了没有位置,这个时候就一直等着,主动观察那个位置空下来了,我就立刻去占位子
  • NIO:去吃饭发现全坐满了没有位置,这个时候我回去做别的事情,时不时去看看有没有位置,如果有就去占位子

4. Reactor 线程模型

单线程模型:所有的 IO 操作都由同一个 NIO 线程处理的

多线程模型:由一组 NIO 线程处理 IO 操作

主从线程模型:一组线程池接收请求,一组线程池处理 IO

相关推荐
掘金者阿豪33 分钟前
Docker命令太多记不住?用Portainer把容器管理变成可视化操作
后端
用户69371750013841 小时前
AI Agent 里的 Loop 到底是什么?
android·前端·后端
Rain的Java大神之路1 小时前
高并发下的抢优惠券如何设计
后端
钟智强1 小时前
AWS CloudGoat 实战:一个 SSRF 如何撬动整个云账户
后端
Ai拆代码的曹操1 小时前
@Transactional 写在 private 方法上,事务根本没生效
后端
云技纵横1 小时前
@Async 默认执行器又炸了:SimpleAsyncTaskExecutor 为什么不是线程池?
后端·面试
程序员Agions1 小时前
Fypro 新手快速上手与实战指南
后端
舒心的云朵1 小时前
用三张图片详解Asp.Net 全生命周期
后端·asp.net
卷无止境1 小时前
C++ 类型转换变迁之路:从隐式转换到 static_cast
c++·后端
孝顺的书包2 小时前
用Asp.net写自己的服务框架
后端·asp.net