`
xiaoZ5919
  • 浏览: 405505 次
  • 性别: Icon_minigender_1
  • 来自: 安平人@北京
博客专栏
Group-logo
Netty学习笔记
浏览量:73259
社区版块
存档分类
最新评论

Nio框架需要注意的两个问题(1)

 
阅读更多

研究了一段时间Nio框架,有Netty和Tomcat的Nio Connector总结了一些共性的问题的解决方案。

 

  1. Selector的register和select有锁冲突,例如tomcat的Nio Connector,他采用的Acceptor和Poller的模式,Acceptor只负责接收socket,Poller是负责读写的IO线程,这种模式不用于nginx,Poller(worker)既负责接收和读写的抢占式模块。这样Acceptor和Poller存在的一个交互就是register,Acceptor需要把接收到的socket注册给Poller。Poller实现了Selector执行select和并且遍历selectionKey操作的封装。

 


    假设Poller正在执行Selector的select方法并且同时Acceptor又接收了新的socket并执行register操作,这时候就会发生锁等待,集体参看http://xiaoz5919.iteye.com/blog/1518473。该如何解决这个问题呢。

    Tomcat是这样解决的,把注册当成一个event,当有注册发生时添加一个注册事件到队列中,Poller在每次执行select之前先处理注册事件队列。这样保证了register和select的执行顺序是永远是一致的,先执行register再执行select,有效地避免了锁冲突。

 


 

  再来看看代码,

 

 

   boolean hasEvents = events();//处理register和cancel事件


                    // Time to terminate?

                    if (close) {

                        timeout(0, false);

                        break;

                    }

                    try {

                        if ( !close ) {

                            if (wakeupCounter.getAndSet(-1) > 0) {

                                //if we are here, means we have other stuff to do

                                //do a non blocking select

                                keyCount = selector.selectNow();

                            } else {

                                keyCount = selector.select(selectorTimeout);

                            }

                            wakeupCounter.set(0);

                        }

 

再看一个细节问题,selector的wakeup是一个很昂贵的工作,假如有多个socket来register也只需一次wakeup,所以tomcat设置了wakeupCounter变量来操作唤醒次数并且只有wakeup==0时才执行一次唤醒操作。

  • 大小: 19 KB
  • 大小: 9.1 KB
1
1
分享到:
评论

相关推荐

    Java NIO通信框架在电信领域的实践

    电信软件是一个宽泛的概念,根据功能和应用场景的不同大致可以分为两大类:系统软件和业务应用软件。系统软件通常涉及底层技术和基础设施,如路由器中的信令机软件和移动设备的操作系统等。而业务应用软件则更侧重于...

    java NIO异步框架

    5. **管道(Pipe)**:管道用于在两个线程间进行单向数据传输。在一个线程中写入的数据可以在另一个线程中读出。 6. **内存映射文件(Memory-Mapped File)**:NIO允许将文件映射到内存中,使得文件操作如同访问...

    基于NIO框架的TeeTime信息平台的设计与实现

    基于NIO框架的TeeTime信息平台的设计与实现一文,详细阐述了Java网络应用开发中面临的并发处理问题,并对NIO(New I/O)技术在Java中的应用进行了深入研究。文章首先指出,在Web2.0时代,应用与客户的互动性要求网络...

    NIO简易服务器框架、文件传输

    在这个例子中,有两个过滤器已经实现: - **日志过滤器(Logger Filter)**:此过滤器负责记录客户端的请求信息,便于调试和追踪。它在数据流转过程中,记录相关的操作和状态。 - **文件拦截过滤器(File ...

    java NIO技巧及原理

    在Java NIO中,"新"主要体现在非阻塞和多路复用这两个特性上,这使得NIO更适合于高并发、低延迟的系统。 **Java IO原理:** Java IO基于流模型,分为输入流和输出流。流是一维数据序列,可以是从源到目标的单向流动...

    NIO和Netty框架的学习

    NIO(Non-blocking Input/Output)和Netty框架是Java平台上的两个核心概念,它们极大地提升了网络应用的性能和效率。本篇文章将深入探讨NIO的基本原理和Netty框架的使用,帮助你从初学者逐渐晋升为高级开发者。 ...

    Java NIO英文高清原版

    7. **管道(Pipe)**:管道是两个线程间进行单向数据传输的通道。一个线程写入数据,另一个线程读取数据。 Netty利用NIO的特性,提供了高度优化的API,使得开发者可以轻松地构建高效、可靠的网络服务。Netty的事件...

    NioSocket,包括server端和client端

    NioSocket是一个基于Java NIO(非阻塞I/O)技术实现的网络通信框架,它包含服务器端(Server)和客户端(Client)两部分。在Java编程中,NIO(New Input/Output)提供了一种不同于传统IO模型的I/O操作方式,其核心...

    用NIO解析modbus协议

    标题中的“用NIO解析modbus协议”表明我们要探讨的是如何使用Java的非阻塞I/O(Non-blocking Input/Output,简称NIO)框架来处理Modbus通信协议。Modbus是一种广泛使用的工业通信协议,主要在自动化设备之间进行数据...

    Java NIO Socket基本

    4. **管道(Pipe)**:在某些特定情况下,两个线程之间可以使用`java.nio.Pipe`进行单向数据传递。 5. **文件系统API**:NIO还提供了`java.nio.file`包,包含一系列与文件系统交互的类,如Files、Paths等。 Java ...

    NIO trick and trap NIO网络

    #### NIO框架的设计与优化 - **Reactor模式**:这是一种常见的设计模式,用于实现NIO网络框架。它包含以下核心组件: - **SynchronousEventDemultiplexer**:负责事件循环和事件分离。 - **Dispatcher**:事件...

    基于NIO的Java聊天室2

    接下来,我们要解决的是上一版本中的一个严重问题:当两个客户端同时启动时,CPU占用率高达100%。这通常是由于线程资源的不当使用导致的。在NIO中,通常我们会使用Selector(选择器)来监听多个通道(Channel)的...

    nio_javanio_NIO_

    管道是两个线程之间的单向数据通道。通过Pipe的SinkChannel写入数据,SourceChannel读取数据,可以实现线程间的通信。 7. **字符集转换** NIO提供了Charset、CharsetDecoder和CharsetEncoder类来处理字符编码和...

    NIO实例

    5. **管道(Pipes)**:用于两个线程间的数据传输。 描述中提到的"博文链接:https://smallbee.iteye.com/blog/2008119"可能提供了一个关于NIO实际应用的示例或详细讲解。虽然具体内容无法在此直接查看,但通常博主...

    talent-nio3.0.0备份

    【标题】"talent-nio3.0.0备份"所指的可能是一个关于NIO(Non-blocking Input/Output)的开源项目或者框架的版本3.0.0的备份文件。NIO是Java中的一种I/O模型,它与传统的 Blocking I/O 相比,提供了更加高效的数据...

    Java IO_NIO

    然而,传统的IO模型在处理大量并发连接时表现出效率较低的问题,为了解决这个问题,Java引入了NIO(Non-blocking Input/Output)模型。 **Java IO核心概念** Java IO的核心类包括InputStream、OutputStream、Reader...

    MINA通讯框架的两个简单实例和文档

    Apache的Mina(Multipurpose Infrastructure Networked ... NIO框架  客户端/服务端框架(典型的C/S架构)  网络套接字(networking socket)类库  事件驱动的异步API(注意:在JDK7中也新增了异步API)

    Socket 之 BIO、NIO、Netty 简单实现

    它允许两个网络应用程序之间建立连接并交换数据。在Java中,`java.net.Socket`和`java.net.ServerSocket`类是进行Socket编程的主要接口。 **2. BIO ( Blocking I/O)** BIO是Java早期提供的网络通信模型,特点是...

    Java NIO非阻塞服务端与客户端相互通信

    - **read()和write()**:这两个方法在非阻塞模式下,如果缓冲区无数据可读或无空间可写,会立即返回,而不是阻塞。 - **Buffer的管理**:读写前后需要管理缓冲区,如flip()、clear()或compact()等方法用于改变缓冲...

Global site tag (gtag.js) - Google Analytics