NIO--1
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的更多相关文章
- 源码分析netty服务器创建过程vs java nio服务器创建
1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io ...
- BIO\NIO\AIO记录
IO操作可以分为3类:同步阻塞(BIO).同步非阻塞(NIO).异步(AIO). 同步阻塞(BIO):在此种方式下,用户线程发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后, ...
- 支撑Java NIO 与 NodeJS的底层技术
支撑Java NIO 与 NodeJS的底层技术 众所周知在近几个版本的Java中增加了一些对Java NIO.NIO2的支持,与此同时NodeJS技术栈中最为人称道的优势之一就是其高性能IO,那么我 ...
- 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 ...
- JAVA NIO学习笔记1 - 架构简介
最近项目中遇到不少NIO相关知识,之前对这块接触得较少,算是我的一个盲区,打算花点时间学习,简单做一点个人学习总结. 简介 NIO(New IO)是JDK1.4以后推出的全新IO API,相比传统IO ...
- Java NIO概述
Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然 Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Se ...
- JAVA NIO Socket通道
DatagramChannel和SocketChannel都实现定义读写功能,ServerSocketChannel不实现,只负责监听传入的连接,并建立新的SocketChannel,本身不传输数 ...
- JAVA NIO FileChannel 内存映射文件
文件通道总是阻塞式的. 文件通道不能创建,只能通过(RandomAccessFile.FileInputStream.FileOutputStream)getChannel()获得,具有与File ...
- java nio系列文章
java nio系列教程 基于NIO的Client/Server程序实践 (推荐) java nio与并发编程相关电子书籍 (访问密码 48dd) 理解NIO nio学习记录 图解ByteBuff ...
- (转)NIO与AIO,同步/异步,阻塞/非阻塞
原文地址: http://www.cnblogs.com/enjoy-ourselves/p/3793771.html 1.flip(),compact(),与clear()的使用 flip()内部实 ...
随机推荐
- cookie和session的介绍
1.cookie和session cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此产生cookie. cookie的工作原理是:由服务器产生 ...
- wm_concat()函数
工作中遇到这样一个问题,一张数据库表中有一个字段file_id,还有一个主键f_id(唯一),而file_id不唯一,我想把file_id=‘123456789’的记录中的f_id(主键)连接成一个字 ...
- (排班表二)后台动态绘制Grid表格
后台动态绘制值班表(Grid表格 列名不固定) 要求:表头除了值班人姓名,还要显示日期,及每天的星期值,用斜杠‘/’分隔.即:几号/星期几 最终实现的效果:根据查询的年月显示每个值班人查询月份每天的值 ...
- Windosw系统——常见的问题
1. 写在某些软件后就无法打开网页,但可以上QQ. 在卸载了一些VPN或USB无线设备后,发现自己网页打不开,但是ping能ping通,也可以登录QQ. 解决办法: (1): 开始运行——regedi ...
- mysql 数据库设计规范
MySQL数据库设计规范 目录 1. 规范背景与目的 2. 设计规范 2.1 数据库设计 2.1.1 库名 2.1.2 表结构 2.1.3 列数据类型优化 2.1.4 索引设计 2.1.5 分库分表. ...
- Percona-Tookit工具包之pt-sift
Preface We've got a lot of files related with system performance which generated by pt-stalk ...
- IntelliJ IDEA 方法注释教程
首先Ctrl +Alt +S ,打开Settings ,找到Live Template,然后点击右侧的绿色的“+”,选择Template Group 然后给新建的Group随便命个名 选中自己刚才创建 ...
- 批量更新python库
import pip from subprocess import call for dist in pip.get_installed_distributions(): try: call(&quo ...
- 怎么退出jQuery的each函数
返回 'false' 将停止循环 (就像在普通的循环中使用 'break').返回 'true' 跳至下一个循环(就像在普通的循环中使用'continue'). 以下举例如何退出 each 函数和退出 ...
- InteliJ IDEA 设置eclipse快捷键
从使用eclipse切换到intellij idea开发工具常常会伴随这快捷切换的困扰,今天写到将intellij idea快捷键设置为eclipse快捷的方式 步骤如下: file -> se ...