Java IO模型辨析

同步与异步

同步和异步关注的是消息通信机制,主要是线程间的协作方式
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态,主要是线程本身等待结果的处理方式

IO模型

  • BIO(1:1):由一个独立的Acceptor线程监听连接,接收到客户连接后为客户创建新线程来处理请求,处理后应答并销毁线程。
  • 伪异步(M:N):Acceptor将请求封装成Task,投递到线程池中。池中维护了消息队列和N个活跃线程。
  • NIO(M:1): 一个多路复用器Selector可以同时轮询多个注册在它上面的Channel,服务端只需要一个线程负责Selector的轮询,就可以接入成千上万的客户端连接。主要有 NIO+单线程Reactor模式、NIO+多线程Reactor模式、NIO+主从多线程Reactor模式这三种模式
    1)分而治之
    一个connection里完整的网络处理过程一般分为6步:accept、read、decode、process、encode、send。
    Reactor模式将每个步骤映射为一个Task,服务端线程执行的最小逻辑单元不再是一次完整的网络请求,而是Task,且采用非阻塞方式执行。
    2)事件驱动
    每个Task对应一个特定事件,当Task准备就绪时,对应的事件通知就会发出。
    Reactor收到事件通知后,分发给绑定了对应事件的Handler执行Task。
  • AIO(M:0):等读写过程完成后再去调用回调函数


    IO模型对比

IO模型图

以下内容转自 http://blog.51cto.com/xingej/1971598

  1. 传统IO模型

  2. 1:1形式的同步阻塞IO通信模型

在基于传统同步阻塞模型中:

  • ServerSocket的主要作用?

    1、负责绑定IP地址

    2、启动监听端口;

  • Socket的主要作用?

    负责发起连接操作。

    连接成功后,双方通过输入输出流进(InputStream/OutputStream)行同步阻塞式通信

  • 通信过程:

    1)服务端通常由一个独立的Acceptor线程负责监听客户端的连接;

    2)Acceptor监听到客户端的连接请求后,为每个客户端创建一个新的线程进行链路处理;

    3)链路处理线程完成客户端请求的处理后,通过输出流返回应答给客户端,然后线程销毁。

  • 模型缺点:

    1)服务端线程个数与客户端并发访问连接数是1:1的关系;

    2)随着客户端并发访问量增大,服务端线程个数线性膨胀,系统性能急剧下降。

  1. M:N形式的同步阻塞IO通信模型

服务端通过线程池来处理多个客户端的接入请求,通过线程池约束及调配服务端线程资源。

形成客户端个数M:服务端线程池最大线程数N的比例关系

通信过程:

1)当有新的客户端接入时,将客户端Socket封装成一个Task投递到服务端任务队列;

2)服务端任务线程池中的多个线程对任务队列中的Task进行并行处理;

3)任务线程处理完当前Task后,继续从任务队列中取新的Task进行处理。

模型缺点:

1)BIO的读和写操作都是同步阻塞的,阻塞时间取决于对端IO线程的处理速度和网络IO的传输速度,可靠性差;

2)当线程池中所有线程都因对端IO线程处理速度慢导致阻塞时,所有后续接入的客户端连接请求都将在任务队列中排队阻塞堆积;

3)任务队列堆积满后,新的客户端连接请求将被服务端单线程Acceptor阻塞或拒绝,客户端会发生大量连接失败和连接超时。
  1. 非阻塞式IO模型(NIO)

基础知识

  1. NIO模型

    多路复用器Selector是NIO模型的基础,一个多路复用器Selector可以同时轮询多个注册在它上面的Channel,服务端只需要一个线程负责Selector的轮询,就可以接入成千上万的客户端连接。

模型优点:

1)NIO中Channel是全双工(是说可以通过Channel 即可完成读操作,也可以完成写操作)的,Channel比流(InputStream/OutputStream)可以更好地映射底层操作系统的API(UNIX网络[编程](https://m.2cto.com/kf)模型中,底层操作系统的通道都是全双工的,同时支持读写操作);

2)客户端发起的连接操作是异步的,不需要像之前的客户端那样被同步阻塞;(此时,客户端不依赖于服务器端,也就是说客户端发完请求可以做其他其他事情)

3)一个Selector线程可以同时处理成千上万个client的请求,而且性能不会随着客户端链接的增加而线性下降;原因:JDK的Selector在[Linux](https://m.2cto.com/os/linux/)等主流操作系统上通过epoll实现,它没有连接句柄数的限制,适合做高性能高负载的网络服务器方案
  1. Reactor模式思想:

分而治之****+****事件驱动

1)分而治之

一个connection里完整的网络处理过程一般分为6步:accept、read、decode、process、encode、send。

Reactor模式将每个步骤映射为一个Task,服务端线程执行的最小逻辑单元不再是一次完整的网络请求,而是Task,且采用非阻塞方式执行。

2)事件驱动

每个Task对应一个特定事件,当Task准备就绪时,对应的事件通知就会发出。

Reactor收到事件通知后,分发给绑定了对应事件的Handler执行Task。

  1. NIO+单线程Reactor模式

说明:

Reactor:负责响应事件,将事件分发给绑定了该事件的Handler处理;

Handler:事件处理器,绑定了某类事件,负责执行对应事件的Task对事件进行处理;

Acceptor:就是处理客户端链接connect事件的; Handler的一种,绑定了connect事件。当客户端发起connect请求时,Reactor会将accept事件分发给Acceptor处理。

模型优缺点

a、单线程版本Reactor模型优点是不需要做并发控制,代码实现简单清晰;

b、缺点是不能利用多核CPU,一个线程需要执行处理所有的accept、read、decode、process、encode、send事件,如果其中decode、process、encode事件的处理很耗时,则服务端无法及时响应其他客户端的请求事件。
  1. NIO+多线程Reactor模式

a、使用线程池执行数据的具体处理过程decode、process、encode,提高数据处理过程的响应速度;

b、Reactor所在单线程只需要专心监听处理客户端请求事件accept、read、write;

此模型缺点:

a、因为Reactor仍是单线程,无法并行响应多个客户端的请求事件(比如同一时刻只能read一个客户端的请求数据)。
  1. NIO+主从多线程Reactor模式

a、采用多个Reactor,每个Reactor在自己单独线程中执行,可以并行响应多个客户端的请求事件;mainReactor 不再是一个单独的NIO线程,而是一个独立的NIO线程池, 处理链接请求,认证,登陆等操作

Acceptor处理完成后,将事件注册到subReactor线程池中的某个IO线程上去,此IO线程继续完成后面的IO操作

b、Netty采用类似这种模式,boss线程池就是多个mainReactor,worker线程池就是多个subReactor。  

Linux中的五种IO模型

https://songlee24.github.io/2016/07/19/explanation-of-5-IO-models/


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容