Netty入门学习笔记(二)--初尝IO

学前准备

学习 Netty 需要一定的 java 基础,特别是有关 IO 方面的知识,了解基本的 IO 模型,特别是 NIO 模型(Netty 以 NIO 作为基础进行封装),更好的理解 Netty 的基本原理。

IO 模型介绍

BIO(同步阻塞IO)

BIO 介绍

BIO 是 JDK 1.4 前使用的网络 IO 模型,但由于其每个客户端连接都为一个其分配一个线程的特性,并且每个连接并非都是在传输数据,造成服务器资源大量的消耗。

改进点:在此基础上新增一个线程池,可以保证一定程度上减少资源消耗,但依旧无法解决无效连接问题。

BIO 模型

Netty入门学习笔记(二)--初尝IO_第1张图片

BIO使用场景

BIO 由于其阻塞的特性,实际生产中使用场景较少。

  1. 适合极少人用,但是每次使用都传输大量数据的场景。

NIO(同步非阻塞IO)

NIO 介绍

NIO (同步非阻塞IO),也叫做 New IO 或者 Non IO。NIO 解决了 BIO 存在的资源浪费问题,不再是一个连接对应服务器一个线程。而是引入 selectorchannelBuffer 等组件,支持一个线程管理多个客户端。
简单理解:Selector 是一个轨道总控制室,Channel 是铁路轨道,Buffer是火车。火车开进轨道后,轨道就通知轨道总控制室,这时轨道总控制室就知道哪条轨道在使用。

Selector(选择器)

选择器,监听 channel 通道中的事件。如果 channel 中有事件推送,感知后处理该通道数据。

Channel(通道)

Channel 通道,与 Buffer 是一对一关系。Channel 提供的 read 和 write 方法都可以将通道中数据读和写到 Buffer 中。

Buffer(缓冲区)

Buffer 缓存区,与 BIO 不同,BIO 中一次只能使用一种,要么是输入流,要么是输出流。Buffer 则即可写也可读,在需要写操作是,调用 filp 方法进行状态切换。

NIO 模型

Netty入门学习笔记(二)--初尝IO_第2张图片

NIO使用场景

  1. 大量连接的应用,比如:应用服务器

AIO(异步非阻塞的IO)

AIO 介绍

AIO 才是真正意义异步操作,用户在发起请求后,在操作系统内核对请求数据进行处理,处理完毕后在通知应用程序,充分利用操作系统提供的并发能力,将异步操作收益最大化。

补充:
平时所说的异步编程,基本上是说 NIO 方面的编写。

AIO 模型

Netty入门学习笔记(二)--初尝IO_第3张图片

AIO使用场景

AIO 属于真正意义的的异步编程。其适用场景主要在需要操作系统支持的场景。

  1. 文件服务器:需要操作系统去支持去读取或操作文件等

额外学习

操作系统中内核态与用户态是啥?

内核态用户态可以理解为一个是管理员权限和一个是用户权限

用户态:

操作范围只能在内存中,由于是内存中操作,读写速度极快,但是无法操作内存以外的能力。

内核态:

可以调用硬件外设,比如:硬盘等。读写速度较慢,操作范围广。

有时候系统响应速度慢,可能的原因是线程在内核态与用户态间频繁切换,造成资源浪费。

什么是同步IO与异步IO?

同步IO:

客户端发起 IO 请求后。这时,用户态是没有权限去操作磁盘,需要切换到内核态,内核态操作磁盘将数据拷贝到用户空间(内存),最后切换回用户态进行数据处理。

简单来说:同步 IO 需要操作系统将数据准备好后,才可以进行下一步操作。

异步IO:

客户端发起 IO 请求后,用户线程从用户态切换内核态这个不变。但是线程继续执行,不阻塞,直到内核态将 IO 操作数据准备完毕后,通知用户线程或者通知某个回调函数。内核态操作 IO 期间,用户线程不需要阻塞等待内核态 IO 完成。

简单来说:异步 IO 提交后,无需阻塞等待,只需在 IO 操作完成后通知自己,在进行后续处理。

你可能感兴趣的:(Netty,入坑指南)