研究了一段时间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
分享到:
相关推荐
电信软件是一个宽泛的概念,根据功能和应用场景的不同大致可以分为两大类:系统软件和业务应用软件。系统软件通常涉及底层技术和基础设施,如路由器中的信令机软件和移动设备的操作系统等。而业务应用软件则更侧重于...
5. **管道(Pipe)**:管道用于在两个线程间进行单向数据传输。在一个线程中写入的数据可以在另一个线程中读出。 6. **内存映射文件(Memory-Mapped File)**:NIO允许将文件映射到内存中,使得文件操作如同访问...
基于NIO框架的TeeTime信息平台的设计与实现一文,详细阐述了Java网络应用开发中面临的并发处理问题,并对NIO(New I/O)技术在Java中的应用进行了深入研究。文章首先指出,在Web2.0时代,应用与客户的互动性要求网络...
在这个例子中,有两个过滤器已经实现: - **日志过滤器(Logger Filter)**:此过滤器负责记录客户端的请求信息,便于调试和追踪。它在数据流转过程中,记录相关的操作和状态。 - **文件拦截过滤器(File ...
在Java NIO中,"新"主要体现在非阻塞和多路复用这两个特性上,这使得NIO更适合于高并发、低延迟的系统。 **Java IO原理:** Java IO基于流模型,分为输入流和输出流。流是一维数据序列,可以是从源到目标的单向流动...
NIO(Non-blocking Input/Output)和Netty框架是Java平台上的两个核心概念,它们极大地提升了网络应用的性能和效率。本篇文章将深入探讨NIO的基本原理和Netty框架的使用,帮助你从初学者逐渐晋升为高级开发者。 ...
7. **管道(Pipe)**:管道是两个线程间进行单向数据传输的通道。一个线程写入数据,另一个线程读取数据。 Netty利用NIO的特性,提供了高度优化的API,使得开发者可以轻松地构建高效、可靠的网络服务。Netty的事件...
NioSocket是一个基于Java NIO(非阻塞I/O)技术实现的网络通信框架,它包含服务器端(Server)和客户端(Client)两部分。在Java编程中,NIO(New Input/Output)提供了一种不同于传统IO模型的I/O操作方式,其核心...
标题中的“用NIO解析modbus协议”表明我们要探讨的是如何使用Java的非阻塞I/O(Non-blocking Input/Output,简称NIO)框架来处理Modbus通信协议。Modbus是一种广泛使用的工业通信协议,主要在自动化设备之间进行数据...
4. **管道(Pipe)**:在某些特定情况下,两个线程之间可以使用`java.nio.Pipe`进行单向数据传递。 5. **文件系统API**:NIO还提供了`java.nio.file`包,包含一系列与文件系统交互的类,如Files、Paths等。 Java ...
#### NIO框架的设计与优化 - **Reactor模式**:这是一种常见的设计模式,用于实现NIO网络框架。它包含以下核心组件: - **SynchronousEventDemultiplexer**:负责事件循环和事件分离。 - **Dispatcher**:事件...
接下来,我们要解决的是上一版本中的一个严重问题:当两个客户端同时启动时,CPU占用率高达100%。这通常是由于线程资源的不当使用导致的。在NIO中,通常我们会使用Selector(选择器)来监听多个通道(Channel)的...
管道是两个线程之间的单向数据通道。通过Pipe的SinkChannel写入数据,SourceChannel读取数据,可以实现线程间的通信。 7. **字符集转换** NIO提供了Charset、CharsetDecoder和CharsetEncoder类来处理字符编码和...
5. **管道(Pipes)**:用于两个线程间的数据传输。 描述中提到的"博文链接:https://smallbee.iteye.com/blog/2008119"可能提供了一个关于NIO实际应用的示例或详细讲解。虽然具体内容无法在此直接查看,但通常博主...
【标题】"talent-nio3.0.0备份"所指的可能是一个关于NIO(Non-blocking Input/Output)的开源项目或者框架的版本3.0.0的备份文件。NIO是Java中的一种I/O模型,它与传统的 Blocking I/O 相比,提供了更加高效的数据...
然而,传统的IO模型在处理大量并发连接时表现出效率较低的问题,为了解决这个问题,Java引入了NIO(Non-blocking Input/Output)模型。 **Java IO核心概念** Java IO的核心类包括InputStream、OutputStream、Reader...
Apache的Mina(Multipurpose Infrastructure Networked ... NIO框架 客户端/服务端框架(典型的C/S架构) 网络套接字(networking socket)类库 事件驱动的异步API(注意:在JDK7中也新增了异步API)
它允许两个网络应用程序之间建立连接并交换数据。在Java中,`java.net.Socket`和`java.net.ServerSocket`类是进行Socket编程的主要接口。 **2. BIO ( Blocking I/O)** BIO是Java早期提供的网络通信模型,特点是...
- **read()和write()**:这两个方法在非阻塞模式下,如果缓冲区无数据可读或无空间可写,会立即返回,而不是阻塞。 - **Buffer的管理**:读写前后需要管理缓冲区,如flip()、clear()或compact()等方法用于改变缓冲...