浅谈Java的IO和NIO怎样实现多路复用的


前言


# 一、IO定义

IO定义

	 io是输入和输出数据的操作总体接口	

BIO定义

阻塞的IO数据行为,程序为完成就会一直阻塞等待
在这里插入图片描述

NIO定义

Java NIO允许您执行非阻塞IO。例如,线程可以要求通道将数据读入缓冲区。当通道将数据读入缓冲区时,线程可以做其他的事情。一旦数据被读入缓冲区,线程就可以继续处理它。将数据写入通道也是如此。
在这里插入图片描述

AIO定义

在这种模式下,用户在将来启动进程I / O操作,不等待内核I / O操作完成,进程将在内核I / O操作完成后通知用户。
在这里插入图片描述

二、使用场景

并发连接数不多时采用BIO,因为它编程和调试都非常简单,但如果涉及到高并发的情况,应选择NIO或AIO,更好的建议是采用成熟的网络通信框架Netty


三、扩展

NIO 的主要组成部分:

Buffer,高效的数据容器,除了布尔类型,所有原始数据类型都有相应的 Buffer 实现。

Channel,类似在 Linux 之类操作系统上看到的文件描述符,是 NIO 中被用来支持批量式 IO 操作的一种抽象。

File 或者 Socket,通常被认为是比较高层次的抽象,而 Channel 则是更加操作系统底层的一种抽象,这也使得 NIO 得以充分利用现代操作系统底层机制,获得特定场景的性能优化,例如,DMA(Direct Memory Access)等。不同层次的抽象是相互关联的,我们可以通过 Socket 获取 Channel,反之亦然。

Selector,是 NIO 实现多路复用的基础,它提供了一种高效的机制,可以检测到注册在 Selector 上的多个 Channel 中,是否有 Channel 处于就绪状态,进而实现了单线程对多 Channel 的高效管理。


总结

1 了解基本的原理比具体的实现更重要。

猜你喜欢

转载自blog.csdn.net/aa327056812/article/details/109580685