一、问题引出。

Hadoop 的Server 采用了Java 的NIO,这样的话就仅需要为每一个socket 连接建立一个线程,读取socket 上的数据。在Server 中,只需要一个线程,就可以accept 新的连接请求和读取socket上的数据。为什么只需一个线程就解决问题了?

二、java NIO的分析

Java NIO旨在快速搬运大量东西,大大提高I/O效率。

(1)    引入了buffer和channel。Buffer:是一块连续的内存块。NIO 数据读或写的中转地。Channel:数据的源头或者数据的目的地用于向 buffer 提供数据或者读取 buffer 数据 ,buffer 对象的唯一接口。可以将buffer当成运煤的卡车,channel是存储煤(数据)的煤矿。

(2)    Selector 的出现。大大改善了多个 Java Socket的效率。在没有NIO的时候,轮询多个socket是通过read阻塞来完成,即使是非阻塞模式,我们在轮询socket是否就绪的时候依然需要使用系统调用。而Selector的出现,把就绪选择交给了操作系统(我们熟知的selec函数),把就绪判断和读取数据分开,不仅性能上大有改善,而且使得代码上更加清晰。

(3)    异步非阻塞 I/O 支持。对于传统的阻塞I/O来说,一调用read,write函数时,线程便进入阻塞态,当数据到来时,线程被唤醒进而读取数据,没有数据时,线程一直处于blocked,不能去做其他的事情,异步非阻塞I/O,一旦有数据来了,线程才去读数据,没有数据时,线程可以解放出来去做其他的事情。

之所以通过一个线程就可以完成多个连接的数据读取任务,是因为Selector采用观察者模式实现,每一个socket连接都封装成channel,并将channel向selector注册, Selector内部原理实际是在做一个对所注册的channel的轮询访问,不断的轮询(目前就这一个算法),一旦轮询到一个channel有所注册的事情发生,比如数据来了,他就会站起来报告,交出一把钥匙,让我们通过这把钥匙来读取这个channel的内容。内部具体实现是传回一组SelectionKey,线程读取这些Key,就会获得刚刚注册过的socketchannel,然后从这个Channel中读取数据。java NIO很好的解决了每来一个连接就分一个线程的资源浪费,效率不高的问题。

hadoop单线程实现server多socket连接读取数据原理分析的更多相关文章

  1. corefx 源码学习:NetworkStream.ReadAsync 是如何从 Socket 异步读取数据的

    最近遇到 NetworkStream.ReadAsync 在 Linux 上高并发读取数据的问题,由此激发了阅读 corefx 中 System.Net.Sockets 实现源码(基于 corefx ...

  2. Python3 pymsyql 连接读取数据

    import pymysql conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db='t ...

  3. DBCP数据源连接池实现原理分析

    前些天在调试公司系统的时候发现这样的一个问题:mysql数据库服务停止一段时间后再次重启后吗,tomcat服务无法请求数据库服务,调试了半天对这个问题进行定位解决,期间也搞了很多有关mysql数据库的 ...

  4. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_4 mybatis中使用unpooled配置连接池的原理分析

    把之前的CRUD的代码src下的代码都复制过来 依赖项也都复制过来, 配置文件 整理一番 执行findAll方法的测试 查看日志的输出部分 修改程序池 再来执行findAll方法 Plooled从连接 ...

  5. 从Excel读取数据,然后分析相似的数据,多线程处理(多线程比较相似的字符串,统计出相似的数量及字符串)

    之前的jar包有问题,现已修改. 需要的jar包,已修改 自己去Maven中央仓库下载jar包. excel数据: 直接上代码. 程序再度优化了一遍.之后如果想再度精准,可能需要建模,最近没空继续做了 ...

  6. live555从RTSP服务器读取数据到使用接收到的数据流程分析

    本文在linux环境下编译live555工程,并用cgdb调试工具对live555工程中的testProgs目录下的openRTSP的执行过程进行了跟踪分析,直到将从socket端读取视频数据并保存为 ...

  7. netty源码解解析(4.0)-14 Channel NIO实现:读取数据

     本章分析Nio Channel的数据读取功能的实现. Channel读取数据需要Channel和ChannelHandler配合使用,netty设计数据读取功能包括三个要素:Channel, Eve ...

  8. (转)live555从RTSP服务器读取数据到使用接收到的数据流程分析

    本文在linux环境下编译live555工程,并用cgdb调试工具对live555工程中的testProgs目录下的openRTSP的执行过程进行了跟踪分析,直到将从socket端读取视频数据并保存为 ...

  9. 连接Mysql提示Can’t connect to local MySQL server through socket的解决方法

    mysql,mysqldump,Mysqladmin,php连接mysql服务常会提示下面错误: ERROR 2002 (HY000): Can't connect to local MySQL se ...

随机推荐

  1. HDU3591找零,背包

    题目大概的意思就是:小强用硬币买东西,硬币有N种,面值为Vi,店家有各种硬币都有无限个,而小强只有Ci个(分别对应Vi) 问最小交易硬币数,就是一个有找零的背包问题啦. 我的上一篇博客跟这hdu359 ...

  2. 原生js判断是否有某个class,如果有就删掉,没有加上

    <style> #div1 { width: 100px; height: 100px; position: absolute; } .div1 { background: red; } ...

  3. jquery validation插件

    jQuery Validate验证框架详解 jQuery校验官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 一.导 ...

  4. CI源码引用使用--php引用demo,静态变量和引用关系

    CI源码引用使用在Common.php中,加载配置和类的方法 function &test() {     static $a = '';     if (!$a) {         $a ...

  5. Balsamiq Mockups

    Balsamiq Mockups完全手册 2010.03.18 发布 48,066 浏览 什么是Balsamiq Mockups Balsamiq Mockups出自加利福尼亚州的Balsamiq工作 ...

  6. UltraEdit软件破解方法

    一.说明 UltraEdit破解软件虽然带有“安装说明.txt”,但是我并没有弄懂--安装说明太模糊.经过一番摸索,找到了破解方法,现记录于此. 二.操作步骤 1.断开网络 2.安装软件 3.打开软件 ...

  7. 使用PHP生成二维码的两种方法(带logo图像)

    一.利用Google API生成二维码 Google提供了较为完善的二维码生成接口,调用API接口很简单,以下是调用代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  8. 转载:如何避免代码中的if嵌套

    http://top.jobbole.com/4960/ http://stackoverflow.com/questions/24430504/how-to-avoid-if-chains 在Sta ...

  9. bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Stat ...

  10. [BZOJ 1025] [SCOI2009] 游戏 【DP】

    题目链接:BZOJ - 1025 题目分析 显然的是,题目所要求的是所有置换的每个循环节长度最小公倍数的可能的种类数. 一个置换,可以看成是一个有向图,每个点的出度和入度都是1,这样整个图就是由若干个 ...