IO通信模型(二)同步非阻塞模式NIO(NonBlocking IO)

简介: 简介同步非阻塞模式

同步非阻塞模式(NonBlocking IO)

在非阻塞模式中,发出Socket的 accept()read()操作时,如果内核中的数据还没有准备好,那么它并不会阻塞用户进程,而是立刻返回一个信息。也就是说进程发起一个read操作后,并不需要一直阻塞等待,而是马上就得到了一个结果。

如果结果发现数据准备完毕就可以读取数据,然后拷贝到用户内存。如果结果发现数据没有就绪也会返回,进程继续不断的 主动询问数据的准备情况是非阻塞模式的一个特点。

微信图片_20220221170742.png伪代码表示如下:

{
 while(read(socket,buffer)!=CCESS){
 }
 process(buffer);
}

Java同步非阻塞模式

如上所述,Java的Socket是阻塞模式的典型应用。在发起 accpet()read()请求之后会持续阻塞,但是Java中提供了 setSoTimeout()方法设置超时时间,在固定时间内没有得到结果,就会结束本次阻塞,等待进行下一次的阻塞轮训。这是,也就实现了应用层面的非阻塞。

Java中Socket中的 setSoTimeout()方法:

微信图片_20220221171357.png

Java同步非阻塞模式编码

通过设置 setSoTimeout()使阻塞模式的服务端 accpet()read()优化为非阻塞模式。 SocketServerNioListenAndRead.java

微信图片_20220221171533.png

微信图片_20220221171711.png

微信图片_20220221171759.png

上面的代码可以实现监听和读取数据的非阻塞,但是还是只能一个一个的处理,可以使用多线程 稍微改进。 SocketServerNioListenThread.java

微信图片_20220221172000.png微信图片_20220221172109.png微信图片_20220221172209.png微信图片_20220221172258.png

同步非阻塞模式总结

用户需要不断地调用,尝试读取数据,直到读取成功后,才继续处理接收的数据。整个IO请求的过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据,仍需要不断地轮询、重复请求,消耗了大量的CPU的资源。一般很少直接使用这种模型,而是在其他IO模型中使用非阻塞IO这一特性。

开发难度相对于阻塞IO模式较难,适合并发小且不需要及时响应的网络应用开发。

GitHub 源码:

https://github.com/niumoo/java-toolbox/

<完>

相关文章
|
Java Linux API
IO模型
BIO、NIO、AIO是Java中处理网络I/O的三种模型。BIO为阻塞式,每个连接需单独线程,高并发下性能受限;NIO通过非阻塞与多路复用提升并发能力,少量线程可处理大量请求;AIO进一步实现异步非阻塞,数据复制时线程可释放,由回调机制处理后续操作。三者适用于不同场景,BIO易用但低效,NIO高效但复杂,AIO理论性能更优但目前在Linux上仍依赖多路复用实现。Java 21引入虚拟线程后,BIO也可兼具高性能与易编写特性。
435 2
|
缓存 安全 Linux
Linux 五种IO模型
Linux 五种IO模型
|
Ubuntu 网络协议 Unix
02理解网络IO:实现服务与客户端通信
网络IO指客户端与服务端通过网络进行数据收发的过程,常见于微信、QQ等应用。本文详解如何用C语言实现一个支持多客户端连接的TCP服务端,涉及socket编程、线程处理及通信流程,并分析“一消息一线程”模式的优缺点。
705 0
|
网络协议 前端开发 Java
网络协议与IO模型
网络协议与IO模型
683 4
网络协议与IO模型
|
安全 NoSQL Java
一文搞懂网络通信的基石✅IO模型与零拷贝
【10月更文挑战第1天】本文深入探讨了网络通信中的IO模型及其优化方法——零拷贝技术。首先介绍了IO模型的概念及五种常见类型:同步阻塞、同步非阻塞、多路复用、信号驱动和异步IO模型。文章详细分析了每种模型的特点和适用场景,特别是多路复用和异步IO在高并发场景中的优势。接着介绍了零拷贝技术,通过DMA直接进行数据传输,避免了多次CPU拷贝,进一步提升了效率。最后总结了各种模型的优缺点,并提供了相关的代码示例和资源链接。
一文搞懂网络通信的基石✅IO模型与零拷贝
|
缓存 网络协议 Java
JAVA网络IO之NIO/BIO
本文介绍了Java网络编程的基础与历史演进,重点阐述了IO和Socket的概念。Java的IO分为设备和接口两部分,通过流、字节、字符等方式实现与外部的交互。
631 0
|
网络协议 Oracle Java
【IO面试题 三】、说说NIO的实现原理
Java NIO的实现原理基于Channel、Buffer和Selector,支持从Channel读取数据到Buffer以及从Buffer写入数据到Channel,并通过Selector实现单线程多Channel的事件驱动IO操作。
【IO面试题 三】、说说NIO的实现原理
|
开发者
什么是面向网络的IO模型?
【10月更文挑战第6天】什么是面向网络的IO模型?
247 3
|
数据挖掘 开发者
网络IO模型
【10月更文挑战第6天】网络IO模型
664 3
|
数据挖掘 开发者
网络IO模型如何选择?
网络IO模型如何选择?【10月更文挑战第5天】
283 2