IO
     linux内核将所有外部设备都看做一个文件来操作,对一个文件的读写会调用内核系统命令,放回一个file descriptor(文件描述符),
对一个socket的读写也会有相应的描述符,称为socketfd
     Java NIO的核心类库多路复用器Selector就是基于epoll的多路复用技术实现
     I/O多路复用技术通过把多个I/O的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求
    
     epoll和select的原理比较类似,并做了很多重大改进
     1  支持一个进程打开的socket描述符(FD)不受限制(仅受限于操作系统的最大文件句柄数),1GB内存的机器上大约是10万个句柄左右,
       具体值可以通过cat /proc/sys/fs/file- max查看
     2  I/O效率不会随着FD数目的增加而线性下降,socket集合的维护成本上,epoll只会对活跃的socket进行操作,因为在内核实现中,
      epoll是根据每个fd上面的callback函数实现额,只有活跃的socket才会去主动调用callback函数
     3 使用mmap加速内核与用户空间的消息传递,epoll是通过内核和用户空间mmap同一块内存来实现的
 
     JDK1.7升级了原来的NIO类
     1 提供能够批量获取文件属性的API,这些API具有平台无关性,另外还提供了标准文件系统的SPI,供各个服务提供商扩展的实现
     2 提供AIO功能,支持基于文件的异步I/O操作和针对网络套接字的异步操作
     3  完成了定义的通道功能,包括对配置和多播数据报的支持
     
     同步阻塞I/O,阻塞的时间取决于对方I/O线程的处理速度和网络I/O的传输速度
     伪异步I/O
     采用线程池和任务队列可以实现一种叫做伪异步的I/O通信框架
     缺陷,当对Socket的输入流进行读取操作的时候,它会一直阻塞下去,直到发生如下三件事:1有数据可读2可用数据已经读取完毕3发生空指针或者I/O异常
     伪异步I/O实际上仅仅是对之前I/O线程模型的一个简单优化,无法从根本上解决同步I/O导致的通信阻塞问题
 
     
     NIO(Non-block I/O)
     与Socket类和ServerSocket类相对应,NIO也提供了SocketChannel和ServerSocketChannel两种不同的套接字通道实现,这两种新增的通道同时支持阻塞和非阻塞两种模式
     NIO弥补了原来同步阻塞I/O的不足,在标准Java代码中提供了高速的、面向块的I/O
     在NIO类库中加入了Buffer(缓冲区)对象,体现了新库与原I/O的一个重要区别,缓冲区不仅仅是一个数组,还提供了对数据的结构化访问以及维护读写位置等信息
     每一种Java基本类型(除了Boolean类型)都对应有一种缓冲区,大多数标准I/O操作都使用ByteBuffer
 
     Channel是一个通道,通道与流的不同之处在于通道时双向的,流只是在一个方向上移动,而通道可以用于读、写或者二者同时进行,Channel是全双工的,
UNIX底层操作系统通道都是全双工的,所以它可以更好的映射底层操作系统API
     Channel分为两大类:用于网络读写的SelectableChannel和用于文件操作的FileChannel
 
     多路复用器Selector
     多路复用器提供选择已经就绪的任务的能力,Selector会不断地轮询注册在其上的Channel,如果某个Channel上面发生读或者写事件,这个Channel就处于就绪状态,会被Selector轮询出来,
然后通过SelectionKey可以获取就绪Channel的集合,进行后续的I/O操作,由于JDK使用了epoll代替了传统的select实现,所以它并没有最大连接句柄1024/2048的限制
 
     AIO
     NIO 2.0引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现,异步通道提供以下两种方式获取操作结果
     1 通过java.util.concurrent.Future类来表示异步操作的结果
     2 在执行异步操作的时候传入一个java.nio.channels
它不需要通过多路复用器对注册的通道进行轮询操作即可以实现异步读写
 
Netty
TCP粘包拆包
使用LineBasedFrameDecoder和StringDecoder可以解决TCP粘包导致的读半包问题,这两者的组合就是按行切换的文本解码器
DelimiterBasedFrameDecoder自动完成以分隔符做结束标志的消息的解码
FixedLengthFrameDecoder可以自动完成对定长消息的解码
 
编解码技术
基于JDK默认的序列化机制可以让程序员避免操作底层的字节数组,序列化的目的主要是网络传输和对象持久化
     当进行跨进程服务调用时,需要把被传输的Java对象编码为字节数组或者ByteBuffer对象,而当远程服务读取到ByteBuffer对象或字节数组时,需要将其    解码为发送时的Java对象,这被称为Java对象编解码技术,Java序列化仅仅是Java编解码技术的一种
     采用JDK序列化机制编码后的二进制数组大小是二进制编码的5倍多
     编解码框架的优势往往从以下几个方面考量:是否支持跨语言,编码后的码流大小,编解码的性能,类库是否小巧方便使用
 
协议栈开发就是基于现有的基础协议(eg http协议)进行的封装扩展
WebSocket协议开发
HTTP协议的弊端  半双工协议,在客户端和服务端两个方向上传输,但是不能同时传输;消息采用文本传输,冗长繁琐;长时间轮询
比较新的一种轮询技术是Comet,使用AJAX,这种技术虽然可以达到双向通信,但依然需要发出请求,而且普遍使用了长连接,会大笑消耗带宽和资源
 
HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽并达到实时通信
 

JAVA的 IO NIO AIO笔记的更多相关文章

  1. Java之io nio aio 的区别

    这个问题最近面试总是遇到,作为一个只会写流水代码的程序员,一脸懵逼.看了网上的解释,看的还是很模糊,说下我对这个的理解. 先引出一个话题,两个大水缸,一个空一个满,让你把一个缸里面的水弄到另一个里面. ...

  2. IO NIO AIO及常用框架概述

    概述 nio 同步: 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写). 异步: 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时,Java将IO读写委托给OS处理,需 ...

  3. 一文理解Java IO/NIO/AIO

      目录 概述 一.IO流(同步.阻塞) 二.NIO(同步.非阻塞) 三.NIO2(异步.非阻塞) 正文 概述 在我们学习Java的IO流之前,我们都要了解几个关键词 同步与异步(synchronou ...

  4. JAVA 中BIO,NIO,AIO的理解

    [转自]http://qindongliang.iteye.com/blog/2018539 ?????????????????????在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解 ...

  5. JAVA 中BIO,NIO,AIO的理解以及 同步 异步 阻塞 非阻塞

    在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步 ...

  6. JAVA 中BIO,NIO,AIO的理解 (转)

    转自: http://qindongliang.iteye.com/blog/2018539 另外类似可参考资料 :http://www.360doc.com/content/13/1029/20/9 ...

  7. Java中BIO,NIO,AIO的理解

    在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步非阻塞? 7 ...

  8. java的IO,AIO简单对比

    以下内容转载lzzzl Channel 通道 Buffer 缓冲区 Selector 选择器 其中Channel对应以前的流,Buffer不是什么新东西,Selector是因为nio可以使用异步的非堵 ...

  9. Java中IO——NIO

    一.引入 当引入一些新功能的时候,那说明之前的设计可能还需要完善. 1.阻塞式 在传统的IO输入输出中,如果我们从流中去读数据,而数据源中没有数据时,程序就会阻塞该线程.阻塞式线程的一种基本状态,可以 ...

随机推荐

  1. dotnet不是内部或外部的命令,也不是可运行的程序或批处理文件

    该问题是由于电脑环境变量配置错误所导致.最初在网上查找的方法,是在系统环境变量path中添加以下语句: %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\ ...

  2. 解决Oracle数据库空间不足问题

    //查询表空间的大小以及文件路径地址select tablespace_name, file_id, file_name,round(bytes/(1024*1024),0) total_space ...

  3. 浅谈https和http2

    最近被问到http2和https的相关知识,这是一篇补基础的博客: 首先想说下https 什么是https https的主要用处: - 建立信息安全通道,保证数据传输的安全 - 确保网站的真实性,防止 ...

  4. Java多线程消费者、生产者的基本思路

    多线程主要考察的就是 线程的同步控制   生产者消费者的思路就是,当 一个线程执行时让另一个线程 挂起就行了 ThreadOne.ThreadTwo同时运行,添加一个变量在一个公共类(下边的Funct ...

  5. [Python] 建 Django 项目

    Python和Django的安装见这里:http://www.runoob.com/django/django-install.html 安装 Django 之后,您现在应该已经有了可用的管理工具 d ...

  6. idea出现找不到实体类

    今天经理遇到一个很奇怪的问题: 在使用idea时,就是包真实存在,但是包中的实体类却无法智能提示,也无法导入成功: 我推荐的解决办法是重新导入,但是没有用,经理在网上找了很多解决方式,依然无效: 最后 ...

  7. Vmware Workstation - linux系统下 VmTools 安装

    程序版本 : VMware® Workstation 14 Pro 系统环境 : win10 64位下 ubuntu-14.04.5-desktop-amd64 问题:在运行linux系统过程中,de ...

  8. Mysql双主互备+keeplived高可用架构介绍

    一.Mysql双主互备+keeplived高可用架构介绍 Mysql主从复制架构可以在很大程度保证Mysql的高可用,在一主多从的架构中还可以利用读写分离将读操作分配到从库中,减轻主库压力.但是在这种 ...

  9. 开发HR人事考试系统介绍

    确定好需要开发的模块以及功能 一套人事考试系统主要模块: 1)组织管理:公司部门成员信息 2)人事管理:人事信息,离职管理,职务管理,岗位管理: 3)考勤管理:班次设置,停工放假,假日设置,刷卡记录, ...

  10. python Strip函数和Split函数的用法总结 (python2.0,但用法与3.0是差不多的)

    strip函数原型 声明:s为字符串,rm为要删除的字符序列. 只能删除开头或是结尾的字符或是字符串.不能删除中间的字符或是字符串. s.strip(rm)        删除s字符串中开头.结尾处, ...