1.为什么不直接用jdk NIO
(1) API繁杂
(2) 原始NIO可靠性不是很高。可靠性包括:断开重连,网络闪断,半包读写,失败缓存
(3) NIO 的epoll BUG会导致多路复用器Selector,空轮训,导致cpu消耗过大,在jdk1.6update18版本已修复,但是经过测试,该问题还存在,只是触发概率降低。

2.早期的BIO缺点
(1)没有数据缓冲区,IO性能有问题
(2)没有C或者C++中的通道Channel(双高速写入读出)概念,只有输入和输出流 (单向)
(3)同步阻塞io,会导致通信线程被长时间阻塞

3. nio和BIO区别
(1) nio数据结构上,增加了数据缓冲区,
(2) 传统的io管首改成双通道channel
(3) 线程模型,由同步阻塞,改为同步非阻塞,和异步非阻塞
(4) 分发机制,加入多路复用机制,Selector
(5)epoll多路复用机制

4.网络linux IO模型
(1)阻塞IO模型,拿到数据包或者发生错误,才返回,其它情况一直在等待执行。效率非常低,容易导致线程任务等待超时。(去食堂排队打饭)
(2)非阻塞IO,应用发起一个IO操作后,不等内核IO操作完成,继续执行,内核IO操作完成后,会通知应用程序。
老板-->让财务去银行
老板-->去睡觉

5.NIO类库

(1)缓冲区,Buffer , 体现了NIO和IO的区别,是一个字节数组,增大了IO的吞吐性(类似港口),除了boolean,其余基本数据类型,都有对应的Buffer

(2)高速通道,Channel,(类似自来水管道),每一个网络数据,都通过通道读取或写入。与流Stream不同的是,channel是双向的。业务包容性增大,减少频繁创建其它管道 。每一个客户端会用一个通道。

(3)多路复用器,Selector,用来不断轮循注册到上面Channel,如果channel上发生的读或写事件,说明通道已就绪,就会被Selector轮循出来(NIO内部机制)

(4)被Selector轮循出来之后,通过SelectorKey获取这些就绪通道的集合(SelectionKeys的作用)。一个多路复用器Selector,可以轮询多个通道Channel,然后进行IO操作,

(5)jdk底层使用epoll取代了传统的select实现,优势在于,没有了最大句柄(Channel对象)1024/2048限制,所以,只需要一个线程负责,Selector

轮循,就可以接入成千上万个客户端的接入,(这就是netty为什么这么快)

(6) ServerSocketChannel,NIO专用的服务类,配合Channel高速通道的一个服务类。
ServerSocket 配传统IO
ServerSocketChannel 配Channel

NIO工作模型

NIO--1的更多相关文章

  1. 源码分析netty服务器创建过程vs java nio服务器创建

    1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io ...

  2. BIO\NIO\AIO记录

    IO操作可以分为3类:同步阻塞(BIO).同步非阻塞(NIO).异步(AIO). 同步阻塞(BIO):在此种方式下,用户线程发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后, ...

  3. 支撑Java NIO 与 NodeJS的底层技术

    支撑Java NIO 与 NodeJS的底层技术 众所周知在近几个版本的Java中增加了一些对Java NIO.NIO2的支持,与此同时NodeJS技术栈中最为人称道的优势之一就是其高性能IO,那么我 ...

  4. Java I/O and NIO [reproduced]

    Java I/O and NIO.2---Five ways to maximize Java NIO and NIO.2---Build more responsive Java applicati ...

  5. JAVA NIO学习笔记1 - 架构简介

    最近项目中遇到不少NIO相关知识,之前对这块接触得较少,算是我的一个盲区,打算花点时间学习,简单做一点个人学习总结. 简介 NIO(New IO)是JDK1.4以后推出的全新IO API,相比传统IO ...

  6. Java NIO概述

    Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然 Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Se ...

  7. JAVA NIO Socket通道

      DatagramChannel和SocketChannel都实现定义读写功能,ServerSocketChannel不实现,只负责监听传入的连接,并建立新的SocketChannel,本身不传输数 ...

  8. JAVA NIO FileChannel 内存映射文件

      文件通道总是阻塞式的. 文件通道不能创建,只能通过(RandomAccessFile.FileInputStream.FileOutputStream)getChannel()获得,具有与File ...

  9. java nio系列文章

    java nio系列教程 基于NIO的Client/Server程序实践 (推荐) java nio与并发编程相关电子书籍   (访问密码 48dd) 理解NIO nio学习记录 图解ByteBuff ...

  10. (转)NIO与AIO,同步/异步,阻塞/非阻塞

    原文地址: http://www.cnblogs.com/enjoy-ourselves/p/3793771.html 1.flip(),compact(),与clear()的使用 flip()内部实 ...

随机推荐

  1. caffe在 14.04安装

    同事安装遇到的问题,记录一下 需要把cuda里面带的opengl不安装才行,否则冲突.在安装时,首先和之前一样,切换到无图形界面,关掉lightdm,安装cuda时选择--no-opengl-lib, ...

  2. 字符串替换For linux C

    1.临时空间给了个1024,不需要可减少长度. 2.结果只用用strcpy了,没校验. bool Replace(char *str,const char *src, const char *des) ...

  3. python基础——文件访问模式

    文件访问模式 访问模式 说明 r 以只读方式打开文件.文件的指针将会放在文件的开头.这是默认模式. w 打开一个文件只用于写入.如果该文件已存在则将其覆盖.如果该文件不存在,创建新文件. a 打开一个 ...

  4. MySQL - Linux下安装

    本安装方式仅对5.7.21版本负责. 下载地址:wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.21-linux-glibc2 ...

  5. Percona-Tookit工具包之pt-stalk

      Preface       We have a lot of methods to diagnose problems in our system such as strace,pstack,gs ...

  6. angularjs处理多个$http

    本文引自:https://www.cnblogs.com/xiaojikuaipao/p/6017899.html 在实际业务中经常需要等待几个请求完成后再进行下一步操作.但angularjs中$ht ...

  7. juicer

    function financingBodyTable(){ var jsonData = { FinancingBodyJSON:${relaListArr}//list数组 } var addMo ...

  8. SqlServer2008/2005数据库日志收缩

    1.SQL2008数据库USE [master]GOALTER DATABASE 数据库名称 SET RECOVERY SIMPLE WITH NO_WAITALTER DATABASE 数据库名称 ...

  9. Python__for循环和列表生成式的区别

    话不多,上例子 >>> L = [,,] >>> for i in range(len(L)): L[i] = L[i] + L[i-] print(L) #结果 ...

  10. PHP无限分类生成树方法,非递归,引用

    //这个是核心方法 function generateTree($items){     $tree = array();     foreach($items as $item){         ...