今天又看了一遍boyan的《Nip trick and trip》,又有一些新的收获。比以前看地更深刻了。其中有一处写到Nio的写优化,当Nio的channel设置为nonblocking时,写操作不再阻塞,而是直接返回0,表示当时socket的写缓冲区已满不可写。通常的处理办法是返回本次loop并继续注册op_read或者op_write。这样会带来线程切换的开销,使当前select阻塞,直到有可写发生再次唤醒。Netty是怎么解决的?以前虽然看过Netty的代码但并没有深入到细节中去,看了boyanNetty采用writeSpinCount的介绍才深有感悟。好多知识都在细节里,就看我们对这个领域掌握地深不深,如果蜻蜓点水肯定发现了这些看似简单的代码的玄妙之处。话归正题,writeSpinCount如何解决这个问题的呢?类似自旋锁,还是看看Netty的代码吧,比较形象。
for (;;) { MessageEvent evt = channel.currentWriteEvent; SendBuffer buf; if (evt == null) { if ((channel.currentWriteEvent = evt = writeBuffer.poll()) == null) { //写事件队列为空,此时应该去除op_write removeOpWrite = true; channel.writeSuspended = false; break; } channel.currentWriteBuffer = buf = sendBufferPool.acquire(evt.getMessage()); } else { buf = channel.currentWriteBuffer; } ChannelFuture future = evt.getFuture(); try { long localWrittenBytes = 0; for (int i = writeSpinCount; i > 0; i --) {//此处为writeSpinCount的解决方式 //向channel写数据,为了使其fileChannel的transferTo接口一致。这样从file写向socket时避免四次copy,sendfile的功能 localWrittenBytes = buf.transferTo(ch); //写入的数据大于0,跳出本次循环,如为零则循环writeSpinCount,如再次期间localWrittenBytes>0,说明再次可写。 if (localWrittenBytes != 0) { writtenBytes += localWrittenBytes; break; } if (buf.finished()) { break; } } if (buf.finished()) { // Successful write - proceed to the next message. //完整地写完,则继续处理下一个消息 buf.release(); channel.currentWriteEvent = null; channel.currentWriteBuffer = null; evt = null; buf = null; future.setSuccess(); } else { // Not written fully - perhaps the kernel buffer is full. //没能完整地写完当前的message,则继续设置op_write,并跳出外层循环 addOpWrite = true; channel.writeSuspended = true; if (localWrittenBytes > 0) { // Notify progress listeners if necessary. future.setProgress( localWrittenBytes, buf.writtenBytes(), buf.totalBytes()); } break; } } catch (AsynchronousCloseException e) { // Doesn't need a user attention - ignore. } catch (Throwable t) { if (buf != null) { buf.release(); } channel.currentWriteEvent = null; channel.currentWriteBuffer = null; buf = null; evt = null; future.setFailure(t); if (iothread) { fireExceptionCaught(channel, t); } else { fireExceptionCaughtLater(channel, t); } if (t instanceof IOException) { open = false; close(channel, succeededFuture(channel)); } } } channel.inWriteNowLoop = false; // Initially, the following block was executed after releasing // the writeLock, but there was a race condition, and it has to be // executed before releasing the writeLock: // // https://issues.jboss.org/browse/NETTY-410 // if (open) { if (addOpWrite) { setOpWrite(channel); } else if (removeOpWrite) { clearOpWrite(channel); } } }
相关推荐
### Netty NIO技术文档知识点概述 #### 一、Netty与NIO的基本概念 - **Netty**:一个高性能的异步事件驱动框架,专为服务器端开发设计,简化了网络应用程序的开发过程。 - **NIO (New I/O)**:Java平台的一种新的...
本实例将深入探讨Netty如何实现NIO在高并发场景下的优化和应用。 首先,让我们理解Java的NIO(Non-blocking I/O,非阻塞I/O)。传统的Java IO模型(BIO)是基于流(Stream)的,对每一个连接都需要一个线程来处理,当...
Netty是一个NIO客户端服务器框架,可以快速轻松地开发网络应用程序,例如协议服务器和客户端。它极大地简化和简化了TCP和UDP套接字服务器等网络编程。 “快速简便”并不意味着最终的应用程序将遭受可维护性或性能...
学习者将学习如何设计和实现自定义协议,以及如何利用Netty的灵活性和可扩展性来优化服务端和客户端的交互。此外,这部分还可能涉及负载均衡、服务发现、异常处理等高级话题,以帮助学员构建高可用、高并发的分布式...
- **零拷贝**:Netty 利用 NIO 的 FileChannel.transferTo 方法,实现了从文件到网络的直接传输,减少了数据拷贝的次数,提高了效率。 - **异步处理**:Netty 的非阻塞 I/O 允许在等待文件传输的同时处理其他任务...
NIO(Non-blocking Input/Output)是Java提供的一种...总之,NIO是一种改进的I/O模型,它提高了处理并发连接的能力,而Netty是建立在NIO之上的网络通信框架,提供了更高级别的抽象和优化,使得网络编程更为便捷高效。
### Netty源码剖析与NIO及Netty5各种RPC架构实战演练三部曲知识点解析 #### 一、Netty概述 Netty是一款基于Java NIO的高性能服务器端编程框架,用于快速开发可维护的网络应用程序。它简化了网络编程的复杂性,使...
当处理如视频流等大数据量传输时,Netty提供了专门的机制来优化数据的读取和写入过程,确保高效率的同时减少资源占用。 #### 五、总结 Netty作为一个先进的网络框架,不仅解决了传统网络编程中的许多痛点,还提供了...
本文将深入探讨BIO( Blocking I/O)、NIO(Non-blocking I/O)、AIO(Asynchronous I/O)以及Netty框架中的线程模型,并与TCP网络协议相结合,为您提供全网最全面的解析。 首先,让我们从基础开始,了解这些I/O...
学习Netty,可以从基础的Socket编程开始,然后深入理解Java NIO的基本概念,接着熟悉Netty提供的各种组件和API,通过编写简单的服务端和客户端程序来实践。随着对Netty的理解加深,可以尝试实现更复杂的网络应用,如...
在本示例中,我们将深入探讨如何利用Netty实现一个基于NIO(非阻塞I/O)的Socket聊天系统。NIO是一种I/O模型,它允许Java程序在不阻塞线程的情况下处理多个输入/输出流,从而提高并发性能。 首先,Netty的核心组件...
Netty基于NIO,但对NIO进行了优化和封装,提供了更高级别的API,使得编程更加简单。Netty的核心组件包括:Bootstrap(启动引导类)、ServerBootstrap(服务器启动引导类)、Channel(网络连接通道)、Pipeline(处理...
**NIO框架Netty详解** Netty是一款高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Netty源于Java NIO(Non-blocking I/O)技术,它提供了更高级别的抽象,使得开发者可以...
此外,还可能探讨不同类型的RPC架构,如gRPC、Dubbo等,以及如何利用NIO和Netty的优势优化这些架构。 【标签】"java网络框架"表明本教程不仅涉及基础的NIO概念,还涵盖了Java平台上的高级网络编程框架。学习者将...
### BIO、NIO、AIO、Netty 面试题解析 #### 1. Java IO 基础概述 Java中的I/O操作是通过流(Stream)来实现的,所有的数据都...同时,了解这些概念也有助于开发者更好地利用Netty这样的框架来优化网络通信层的性能。
Java NIO(New IO)是Java 1.4版本引入的一种新的IO API,用来替代标准的Java IO API。NIO提供了非阻塞的I/O操作,可以提高在处理多个连接时的性能...结合源码阅读和实践,可以更深入地理解Netty的工作原理和优化技巧。
7. **Netty底层原理**:探讨Netty如何利用Java NIO实现异步非阻塞I/O,以及零拷贝技术的工作机制,帮助读者理解Netty的高效性。 8. **案例分析**:通过实际项目案例,展示Netty在实际场景中的应用,如P2P下载、...
5. **性能优化**:讨论Netty在性能优化方面的策略,包括内存管理、零拷贝(Zero-Copy)技术、线程池配置等,帮助开发者实现高效且低延迟的应用。 6. **实战案例**:提供实际的示例和案例,帮助读者将理论知识应用到...
这个“Netty 讲义.zip”压缩包包含了一系列关于 Netty 的学习资料,主要分为四个部分:入门、进阶、NIO 和优化与源码分析。 首先,我们来探讨 Netty 的入门知识。`Netty02-入门.md` 可能会涵盖以下内容:Netty 的...