学前准备
学习 Netty 需要一定的 java 基础,特别是有关 IO 方面的知识,了解基本的 IO 模型,特别是 NIO 模型(Netty 以 NIO 作为基础进行封装),更好的理解 Netty 的基本原理。
IO 模型介绍
BIO(同步阻塞IO)
BIO 介绍
BIO 是 JDK 1.4 前使用的网络 IO 模型,但由于其每个客户端连接都为一个其分配一个线程的特性,并且每个连接并非都是在传输数据,造成服务器资源大量的消耗。
改进点:在此基础上新增一个线程池,可以保证一定程度上减少资源消耗,但依旧无法解决无效连接问题。
BIO 模型
BIO使用场景
BIO 由于其阻塞的特性,实际生产中使用场景较少。
- 适合极少人用,但是每次使用都传输大量数据的场景。
NIO(同步非阻塞IO)
NIO 介绍
NIO (同步非阻塞IO),也叫做 New IO 或者 Non IO。NIO 解决了 BIO 存在的资源浪费问题,不再是一个连接对应服务器一个线程。而是引入 selector、channel、Buffer 等组件,支持一个线程管理多个客户端。
简单理解:Selector 是一个轨道总控制室,Channel 是铁路轨道,Buffer是火车。火车开进轨道后,轨道就通知轨道总控制室,这时轨道总控制室就知道哪条轨道在使用。
Selector(选择器)
选择器,监听 channel 通道中的事件。如果 channel 中有事件推送,感知后处理该通道数据。
Channel(通道)
Channel 通道,与 Buffer 是一对一关系。Channel 提供的 read 和 write 方法都可以将通道中数据读和写到 Buffer 中。
Buffer(缓冲区)
Buffer 缓存区,与 BIO 不同,BIO 中一次只能使用一种,要么是输入流,要么是输出流。Buffer 则即可写也可读,在需要写操作是,调用 filp 方法进行状态切换。
NIO 模型
NIO使用场景
- 大量连接的应用,比如:应用服务器
AIO(异步非阻塞的IO)
AIO 介绍
AIO 才是真正意义异步操作,用户在发起请求后,在操作系统内核对请求数据进行处理,处理完毕后在通知应用程序,充分利用操作系统提供的并发能力,将异步操作收益最大化。
补充:
平时所说的异步编程,基本上是说 NIO 方面的编写。
AIO 模型
AIO使用场景
AIO 属于真正意义的的异步编程。其适用场景主要在需要操作系统支持的场景。
- 文件服务器:需要操作系统去支持去读取或操作文件等
额外学习
操作系统中内核态与用户态是啥?
内核态与用户态可以理解为一个是管理员权限和一个是用户权限
用户态:
操作范围只能在内存中,由于是内存中操作,读写速度极快,但是无法操作内存以外的能力。
内核态:
可以调用硬件外设,比如:硬盘等。读写速度较慢,操作范围广。
有时候系统响应速度慢,可能的原因是线程在内核态与用户态间频繁切换,造成资源浪费。
什么是同步IO与异步IO?
同步IO:
客户端发起 IO 请求后。这时,用户态是没有权限去操作磁盘,需要切换到内核态,内核态操作磁盘将数据拷贝到用户空间(内存),最后切换回用户态进行数据处理。
简单来说:同步 IO 需要操作系统将数据准备好后,才可以进行下一步操作。
异步IO:
客户端发起 IO 请求后,用户线程从用户态切换内核态这个不变。但是线程继续执行,不阻塞,直到内核态将 IO 操作数据准备完毕后,通知用户线程或者通知某个回调函数。内核态操作 IO 期间,用户线程不需要阻塞等待内核态 IO 完成。
简单来说:异步 IO 提交后,无需阻塞等待,只需在 IO 操作完成后通知自己,在进行后续处理。