OIO、NIO、AIO小结

OIO、NIO、AIO

BIO中,每个线程只能处理一个channel(同步的,该线程和该channel绑定)。
线程发起IO请求,不管内核是否准备好IO操作,从发起请求起,线程一直阻塞,直到操作完成,如图:
BIO的做法是,叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。

NIO中(同步非阻塞通信),每个线程可以处理多个channel(异步)。
线程发起IO请求,立即返回;内核在做好IO操作的准备之后,通过调用注册的回调函数通知线程做IO操作,线程开始阻塞,直到操作完成
NIO的做法是,叫一个线程不停的循环观察每一个水壶,根据每个水壶当前的状态去处理。

AIO中(彻底的异步通信),线程发起IO请求,立即返回;内存做好IO操作的准备之后,做IO操作,直到操作完成或者失败,通过调用注册的回调函数通知线程做IO操作完成或者失败
AIO的做法是,每个水壶上装一个开关,当水开了以后会提醒对应的线程去处理。

那么BIO如何处理海量连接请求呢?
是对每个请求封装成一个request,然后从线程池中挑一个worker线程专门为此请求服务,如果线程池中的线程用完了,就对请求进行排队。请求中如果有读写数据,是会阻塞线程的
直到发生: 有数据可读 、可用数据以及读取完毕 、发生空指针或I/O异常

BIO、NIO、AIO适用场景分析:

BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。

NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。

AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

同步阻塞IO、同步非阻塞IO、异步阻塞IO、异步非阻塞IO

标题标题同步阻塞IO(JAVA BIO):

同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
你到饭馆点餐,然后在那等着,还要一边喊:好了没啊!

标题#同步非阻塞IO(Java NIO) :

同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。用户进程也需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问。
在饭馆点完餐,就去遛狗了。不过溜一会儿,就回饭馆喊一声:好了没啊!

异步阻塞IO(Java NIO):

此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成,那么为什么说是阻塞的呢?因为此时是通过select系统调用来完成的,而select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄(如果从UNP的角度看,select属于同步操作。因为select之后,进程还需要读写数据),从而提高系统的并发性!
遛狗的时候,接到饭馆电话,说饭做好了,让您亲自去拿。

(Java AIO(NIO.2))异步非阻塞IO:

在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。
饭馆打电话说,我们知道您的位置,一会给你送过来,安心遛狗就可以了。

缓冲区buffer、通道channel、多路复用器 Selector、NIO服务端、AIO编程

(1)缓冲区buffer

buffer是一个对象,包含了读取和写入的数据,在nio中,所有的数据都是通过缓冲区来处理的。在写入数据时,也是写入到缓冲区中。任何时候访问NIO中的数据,都是通过缓冲区进行操作。
缓冲区实际是一个数组结构,并提供了对数据结构化访问以及维护读写位置等信息。
8种基本类型都有相应的缓冲区:ByteBuffe、CharBuffer、 ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer。他们实现了相同的接口:Buffer。

(2)通道channel

我们对数据的读取和写入都要通过channel,它就像水管一样,是一个通道。通道不同于流的地方就是通道是双向的,可以用于读、写和同时读写操作。
底层的操作系统的通道一般都是全双工的,所以全双工的Channel比流能更好的映射底层操作系统的API。
channel主要有2大类:
selectablechannel 用于用户网络的读写(后面代码会涉及的ServerSocketChannel和SocketChannel都是SelectableChannel的子类。)
Filechannel 用于文件的操作

(3)多路复用器 Selector

Selector是Java NIO 编程的基础。
提供选择已经就绪的任务的能力:Selector会不断轮询注册在其上的Channel,如果某个Channel上面发生读或者写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪Channel的集合,进行后续的I/O操作。
一个Selector可以同时轮询多个Channel,因为JDK使用了epoll()代替传统的select实现,所以没有最大连接句柄1024/2048的限制。所以,只需要一个线程负责Selector的轮询,就可以接入成千上万的客户端。

(4)NIO服务端

创建NIO服务端的主要步骤如下:
1.打开ServerSocketChannel,监听客户端连接
2.绑定监听端口,设置连接为非阻塞模式
3.创建Reactor线程,创建多路复用器并启动线程
4.将ServerSocketChannel注册到Reactor线程中的Selector上,监听ACCEPT事件
5.Selector轮询准备就绪的key
6.Selector监听到新的客户端接入,处理新的接入请求,完成TCP三次握手,简历物理链路
7.设置客户端链路为非阻塞模式
8.将新接入的客户端连接注册到Reactor线程的Selector上,监听读操作,读取客户端发送的网络消息
9.异步读取客户端消息到缓冲区
10.对Buffer编解码,处理半包消息,将解码成功的消息封装成Task
11.将应答消息编码为Buffer,调用SocketChannel的write将消息异步发送给客户端
所以不能保证一次能吧需要发送的数据发送完,此时就会出现写半包的问题。我们需要注册写操作,不断轮询Selector将没有发送完的消息发送完毕,然后通过Buffer的hasRemain()方法判断消息是否发送完成。

#两种I/O多路复用模式:Reactor和Proactor

reactor 反响堆:非阻塞同步网络模型,可以理解为:来了事件我通知你,你来处理
事件分离器负责等待文件描述符或socket为读写操作准备就绪,然后将就绪事件传递给对应的处理器,最后由处理器负责完成实际的读写工作。

proactor 前摄器:异步网络模型,可以理解为:来了事件我来处理,处理完了我通知你。

Netty 有一个简单却不失强大的架构。这个架构由三部分组成——缓冲(buffer),通道(channel),事件模型(event model)——所有的高级特性都构建在这三个核心组件之上。

OIO、NIO、AIO小结相关推荐

  1. Netty序章之BIO NIO AIO演变

    Netty序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使用 ...

  2. bio阻塞的缺点_java 中的 BIO/NIO/AIO 详解

    java 的 IO 演进之路 我们在前面学习了 linux 的 5 种 I/O 模型详解 下面我们一起来学习下如何使用 java 实现 BIO/NIO/AIO 这 3 种不同的网络 IO 模型编程. ...

  3. 关于BIO | NIO | AIO的讨论

    关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...

  4. 【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)...

    网上有很多讲同步/异步/阻塞/非阻塞/BIO/NIO/AIO的文章,但是都没有达到我的心里预期,于是自己写一篇出来. 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数 ...

  5. 也谈BIO | NIO | AIO (Java版--转)

    http://my.oschina.net/bluesky0leon/blog/132361 关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BI ...

  6. 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章

    来源:编程新说 网上有很多讲同步/异步/阻塞/非阻塞/BIO/NIO/AIO的文章,但是都没有达到我的心里预期,于是自己写一篇出来. 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTT ...

  7. IO: BIO ? NIO ? AIO?

    IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSock ...

  8. 内核aio_今天来说说令人让人傻傻分不清的BIO,NIO,AIO

    | 作者:新一. | 简书:https://www.jianshu.com/u/b3263fc54bce | 知乎:https://www.zhihu.com/people/qing-ni-chi-y ...

  9. Java的IO:BIO | NIO | AIO

    原文: http://my.oschina.net/bluesky0leon/blog/132361 BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...

最新文章

  1. C++ 字符串字母大小写转换
  2. 机器学习 —— 基础整理(三)生成式模型的非参数方法: Parzen窗估计、k近邻估计;k近邻分类器...
  3. php arraymap()函数
  4. C# 多线程 线程池(ThreadPool) 2 如何控制线程池?
  5. Volley框架使用及源码解析
  6. Sequelize 中文文档 v4 - Querying - 查询
  7. 什么是 StackBlitz 的 web container
  8. php导入跟引入的区别,PHP7 引入的“??” 和“?:”的区别
  9. 创业6年,网络营销真的很重要
  10. 云计算解码:技术架构和产业运营
  11. [moka同学笔记]WINDOWS中cmd的切换目录cd命令失效
  12. Linux如何在系统启动时自动加载模块 .
  13. visual studio 图标_知识内容创作者必会:如何一键获取苹果软件图标?
  14. MySQL 入门(七)—— 视图
  15. Windows安装Protoc
  16. 树莓派内网穿透方法大全
  17. 嘉楠科技被「华尔街」看空
  18. 独上高楼望尽天涯路;为伊得人憔悴、衣带渐宽终不悔;几处早莺争暖树,乱花渐欲迷人眼;梅先菊后何须较、好似人生各有时;
  19. 太一星晨印朝晖:从应用交付到融合安全
  20. 如何将华为NFC手机模拟成实体门禁卡、考勤卡

热门文章

  1. Python爬取码市项目
  2. Java后端学习,推荐书籍和学习路线
  3. 加速信创落地,最新国产身份目录服务首发
  4. python检查https过期_Python实现HTTPS网站证书过期监控及更新
  5. 联想拯救者y7000p加内存条_怎么给笔记本升级内存和硬盘 联想Y7000P加装内存和硬盘图文介绍...
  6. 基于腾讯轻量服务器安装Aria2+AriaNg+Nginx+File Brower 服务
  7. I want to do that you feel proud of me.
  8. linux调节伽马值软件,LightBulb(屏幕伽马值自动调整)
  9. 算数运算异常ArithmeticException
  10. [论文阅读笔记12]An Effective Transition-based Model for Discontinuous NER