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

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
分享到:
评论

相关推荐

    常见NIO开源框架(MINA、xSocket)学习

    不过实际应用中一个socket服务器采用传统的阻塞式socket方式通信可能会是一场灾难,一路socket同时进行读写操作可能就需要两条线程,如果需要并发一百路socket(这个量其实很小了),可能就是两百条线程,大概几分钟...

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

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

    Apache Mina Server 2.0 参考手册

    Mina 主要有1.x 和2.x 两个分支,这里我们讲解最新版本2.0,如果你使用的是Mina 1.x, 那么可能会有一些功能并不适用。学习本文档,需要你已掌握JAVA IO、JAVA NIO、JAVA Socket、JAVA 线程及并发库(java.util....

    Apache-Mina-Server-2.0中文参考手册V1.0.docx

    Mina 主要有 1.x 和 2.x 两个分支,这里我们讲解最新版本 2.0,如果你使用的是 Mina 1.x,那么可能会有一些功能并不适用。学习本文档,需要你已掌握 JAVA IO、JAVA NIO、JAVA Socket、JAVA 线程及并发库(java.util....

    Dubbo面试28题答案详解:核心功能+服务治理+架构设计等

    RPC 指的是远程调用协议,也就是说两个服务器交互数据。 2.Dubbo的由来? 互联网的快速发展,Web应用程序的规模不断扩大,一般会经历如下四个发展阶段。 Dubbo的主要应用场景? 透明化的远程方法调用,就像调用本地...

    mina中文开发手册.pdf

    Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP 协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),...Mina 主要有1.x 和2.x 两个分支…………

    服务端各类面试题合集.pdf

    另外由于依托了Spirng、SpirngBoot的优势之上,两个框架在开始目标就不一致 Dubbo定位服务治理、SpirngCloud是一个生态 1.2 Dubbo支持哪些序列化方式? 默认使用Hessian序列化,还有Duddo、FastJson、Java自带序列化...

    Java高并发实战_java高并发_高并发_

    介绍了两个重要的并行性能评估定律, 以及 Java 内存模型 JMM。第2章介绍了 Java 并行程序开发的基础, 包括 Java 中 Thread 的基本使用方法等第3章介绍了 JDK 内部对并行程序开发的支持, 主要介绍 JUC (Java.util....

    JDK_API_1_6_zh_CN_downcc.com.zip 良心一级分

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    微信小程序之WebSocket

    做了几年后台开发,使用最多的框架之一的就是它,NIO模型,而且非常轻量级,同样的rps,java可能需要700-800M的内存,tornado只要30-40M,所以在一台4G内存的机子上可以跑上百个tornado服务,而java,对不起,只能跑...

    Rabbit:RPC框架,使用ZooKeeper,Netty,期待良好的设计

    Rabbit从头搭建一个RPC框架,初步打算使用Netty进行数据通信,后期可能会增加BIO和NIO的方式因为是小白入门级别,所以项目代号Rabbit1、首先,先解释下RPC:RPC = Remote Procedure Call ,远程过程调用,它能够通过...

    java+大数据(1).pdf

    lucence/solr/elasticsearch(10天) scala/phthon(每个五天) 通信框架(Mina/netty)(⼤数据中⽤到) spark(各个模块都讲解)(10天) CDH(五天) openstack(七天) 掌握了以上知识点⼤数据项⽬⼈选⼀个或两个 ⼤数据+⼈...

    java开源包1

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    编程狂人第十二期

    Java IO vs NIO vs AIO vs 协议Servlet 3.0 以及NIO的框架 Integer.valueOf(String) 方法之惑 在运行期通过反射了解JVM内部机制 程序设计 Objective-C相关Category的收集 文章: 豆瓣 CODE 两年历程回顾:git 不是...

    1_6_zh_CN.CHM

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    java开源包11

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java开源包2

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java开源包3

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java+大数据.pdf

    掌握了以上知识点⼤数据项⽬⼈选⼀个或两个 ⼤数据+⼈⼯智能项⽬ 1) ⽀付宝⽤户画像(余额宝⽤户部分)(10天) 2)⽀付宝订单系统(贷款部分)⼤数据分析 (15天) 3)阿⾥飞猪旅游⽹⼤数据分析(包含智能推荐部分...

    java开源包6

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

Global site tag (gtag.js) - Google Analytics