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()内部实 ... 
随机推荐
- xcode怎样分析检测内存泄露(iOS)
			虽然iOS 5.0版本之后加入了ARC机制,由于相互引用关系比较复杂时,内存泄露还是可能存在.所以了解原理很重要. 这里讲述在没有ARC的情况下,如何使用Instruments来查找程序中的内存泄露, ... 
- C#进阶学习笔记(个人整理)
			学习笔记 第一章: 一.回顾数组 1.变量 : 只能存储一个数据 2.数组 :存储固定大小的相同类型的数据 3.对象 : 存储多个相同/不同类型的数据 4.集合 : 特殊的容器,存储N个相同/不同类型 ... 
- django连接mysql数据库配置,出现no module named mysqldb报错
			作为一个菜鸟运维也是要有梦想的,万一学会了python走向人生巅峰了呢.好吧,都是瞎想,今天主要介绍下django配置,最近也开始摸索这个牛b框架了,当然大佬肯定不屑一顾,都是照顾照顾我们这些菜鸟初学 ... 
- docker基础——关于安装、常用指令以及镜像制作初体验
			为什么使用docker docker就是一个轻量级的虚拟机,他解决的是服务迁移部署的时候环境配置问题.比如常见的web服务依赖于jdk.Tomcat.数据库等工具,迁移项目就需要在新的机器重新配置这些 ... 
- python版opencv:如何用笔记本摄像头拍照保存
			因为需要制作制作数据集 所以需要在笔记本上外置了一个logi的摄像头 准备使用python上得opencv来进行拍照 环境:opencv+pycharm+win10+py3 #coding:utf-8 ... 
- L2-032 彩虹瓶 (25 分)
			L2-032 彩虹瓶 (25 分) 彩虹瓶的制作过程(并不)是这样的:先把一大批空瓶铺放在装填场地上,然后按照一定的顺序将每种颜色的小球均匀撒到这批瓶子里. 假设彩虹瓶里要按顺序装 N 种颜色的小 ... 
- 笔记-爬虫-去重/bloomfilter
			笔记-爬虫-去重/bloomfilter 1. 去重 为什么要去重? 页面重复:爬的多了,总会有重复的页面,对已爬过的页面肯定不愿意再爬一次. 页面更新:很多页面是会更新的,爬取这种页面时就 ... 
- 在MAC下使用Robotframework+Selenium2【第二枪】如何处理Table点击指定记录
			1.通过关键字Get Matching Xpath Count获取table中的记录 2.遍历Table所有记录 3.判断记录是否符合条件,做点击操作 
- 13 Django组件-cookie与session
			会话跟踪技术 1 什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10 ... 
- 读json文件发生错误,所遇到的坑
			当我们生产者生产json 文件的时候 消费时用JSON读文件时,如下: val values = kafkardd.map(t=>JSON.parseObject(t._2)) 如果发生以下 ... 
