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. Siamese Network

    摘抄自caffe github的issue697 Siamese nets are supervised models for metric learning [1]. [1] S. Chopra, ...

  2. 前端面试题二(来自前端网http://www.qdfuns.com/notes/23515/fa8b1e788ac39b04108fc33e5b543c4a.html)

    HTML&CSS 1.请描述一下 cookies,sessionStorage 和 localStorage 的区别? cookie是网站为了标示用户身份而储存在用户本地终端(Client S ...

  3. javascript入门笔记3-dom

    1.通过ID获取元素 document.getElementById("id") <!DOCTYPE HTML> <html> <head> & ...

  4. Python 文件访问模式

    f = open('xxx文件', '访问模式') r    以只读方式打开文件(read).文件的指针将会放在文件的开头.默认模式. w   打开一个文件只用于写入(write).如果该文件已存在则 ...

  5. 1060: [ZJOI2007]时态同步

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3610  Solved: 1521[Submit][Status][Discuss] Descript ...

  6. html编写头部,mata的含义

    <meta name="viewport" content="width=device-width, initial-scale=1.0"> con ...

  7. tomcat7下载地址

    tomcat7下载地址:https://tomcat.apache.org/download-70.cgi

  8. Mysql入门基础命令

    1    Mysql基本操作 1.1    查询当前数据库 mysql> show databases; +--------------------+ | Database | +------- ...

  9. Hive的数据库和表

    本文介绍一下Hive中的数据库(Database/Schema)和表(Table)的基础知识,由于篇幅原因,这里只是一些常用的.基础的. Hive的数据库和表 先看一张草图: Hive结构 从图上可以 ...

  10. POJ:2429-GCD & LCM Inverse(素数判断神题)(Millar-Rabin素性判断和Pollard-rho因子分解)

    原题链接:http://poj.org/problem?id=2429 GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K To ...