Netty之四种常用 IO 模型

四种常用 IO 模型:

同步阻塞 BIO: 最简单的 IO 模型,用户线程在读写时被阻塞.

数据拷贝指请求到的数据先存放在内核空间, 然后从内核空间拷贝至程序的缓冲区.

img

用户线程在 IO 过程中被阻塞,不能做任何事情,对 CPU 的资源利用率不高.

同步非阻塞 NIO: 用户线程不断发起 IO 请求. 数据未到达时系统返回一状态值; 数据到达后才真正读取数据.

img

用户线程每次请求 IO 都可以立即返回,但是为了拿到数据,需不断轮询,无谓地消耗了大

量的 CPU. 一般很少直接使用这种模型,而是在其他 IO 模型中使用非阻塞 IO 这一特性

IO 多路复用: IO 多路复用建立在内核提供的阻塞函数 select 上,用户先将需要进行 IO 操作的 socket 添加到 select 中,然后等待阻塞函数 select 返回。当数据到达后,socket 被激活,select 返回,用户线程就能接着发起 read 请求。

img

实际上, 我们可以给 select 注册多个 socket, 然后不断调用 select 读取被激活的 socket,实现在同一线程内同时处理多个 IO 请求的效果. 更进一步, 我们把 select 轮询抽出来放在一个线程里, 用户线程向其注册相关 socket 或 IO请求,等到数据到达时通知用户线程,则可以提高用户线程的 CPU 利用率. 这样, 便实现了用户数据读写的异步方式.

1

IO 多路复用是最常使用的 IO 模型,因其轮询 select 的线程会被阻塞, 异步程度还不够“彻
底”, 所以常被称为异步阻塞 IO

异步 AIO: 真正的异步 IO 需要操作系统更强的支持。IO 多路复用模型中,数据到达内核后通知用户线程,用户线程负责从内核空间拷贝数据;而在异步 IO 模型中,当用户线程收到通知时,数据已经被操作系统从内核拷贝到用户指定的缓冲区内,用户线程直接使用即可。

img

相比于 IO 多路复用,异步 IO 并不常用,因为目前操作系统对异步 IO 的支持并不完善,IO多路复用也基本够用. 有很多做法是用 IO 多路复用模型模拟异步 IO(IO 事件触发时不直接通知用户线程,而是将数据读写完毕后放到用户指定的缓冲区中)。

猜你喜欢

转载自blog.csdn.net/a1774381324/article/details/120796494