扩展篇之BIO以及NIO

服务端处理网络请求的流程图


image.png

主要步骤包括
①获取请求数据: 客户端与服务器建立连接发出请求,服务器接受请求(1-3)
②构建响应:在用户空间处理客户端请求,直到构建响应完成(4)
③返回数据:将构建好的响应再通过内核空间的网络I/O发还给客户端

所以,服务端有两个关键点
①如何管理连接,获取输入数据
②服务器如何处理请求

阻塞与非阻塞

阻塞:被调用方在收到请求到返回结果之前的这段时间,调用方将一直等待。
非阻塞:调用方可以去忙别的事

所以,阻塞与非阻塞,主要说的是调用方


同步处理与异步处理

同步:被调用方得到最终结果,才返回。
异步:被调用方先返回应答,然后在计算结果,计算完最终结果再通知并返回。
所以,同步与异步,主要说的是被调用方


阻塞I_O模型.png

优点:在阻塞等待数据期间,进程/线程挂起,基本不会占用CPU资源
缺点:每个连接需要单独的线程/进程单独处理,并发大时线程切换开销大


非阻塞式I_O模型.png

优点:不会阻塞在内核等待数据,每次可以立马返回,实时性较好
缺点:会占用大量的CPU时间,系统资源利用率低


I_O复用模型.png

之前我们的I/O阻塞模型不是会创建大量连接?那现在我们就先注册到select上,让select有数据了再通知我们。

优点:可以基于一个阻塞对象,同时在多个描述符上进行等待就绪,而不是使用多个线程。
缺点:连接数较少时效率相比多线程+阻塞I/O模型,效率较低,延时会更大。因为单个连接处理要经过2次系统调用,占用时间会增加


线程模型

传统阻塞I_O服务模型.png

Reactor模型
针对阻塞I/O模型进行了改进
①基于I/O复用模型,多个连接共用一个阻塞对象,应用程序只需要在一个阻塞对象上等待,无需等待所有连接。
②基于线程池复用线程资源,不必再为每个连接创建线程,将连接完成后的业务处理任务分配给线程进行处理,一个线程可以处理多个连接的业务。


Reactor模型.png

Reactor模式也叫Dispatcher模式,即I/O多了复用同一监听事件,收到事件后进行分发
Reactor模式中的两个关键组成
①Reactor,在单独的线程中运行,负责监听和分发事件,分发给适当的处理程序来对I/O事件做出反应。
②Handlers,处理程序执行I/O事件要完成的实际事件。

根据Reactor的数量和处理资源池线程的数量不同。
有3中典型实现:
①单Reactor单线程
②单Reactor多线程
③主从Reactor多线程

单Reactor单线程

单Reactor单线程.png

说明:
①Reactor对象通过select监听客户端请求时间,收到事件后通过dispatch进行分发
②建立连接请求事件,则由Acceptor通过accept处理连接请求,然后创建Handler对象处理连接完成后的后续业务处理
③如果不是连接事件,则Reactor会分发调用连接对应的Handler来相应
④Handler会完成read->业务处理->send的完整业务流程

优点:简单明了,没有多线程竞争
缺点:
性能问题:只有一个线程,无法发挥多线程的优势
可靠性问题:线程死了,会导致整个通信模块不可用。

使用场景:客户端数量有限,业务处理非常快速,如Redis


单Reactor多线程

单Reactor多线程.png

①Reactor对象通过select监听客户端请求时间,收到事件后通过dispatch进行分发
②建立连接请求事件,则由Acceptor通过accept处理连接请求,然后创建Handler对象处理连接完成后的后续业务处理
③如果不是连接事件,则Reactor会分发调用连接对应的Handler来相应
④Handler只负责响应事件,不做业务处理,通过read读取数据后,分发给后面的Worker线程池进行业务处理
⑤Worker线程池分配独立的线程完成真正的业务处理
⑥Handler收到响应结果后通过send将结果返回给client

优点:可以充分利用多核CPU
缺点:Reactor在高并发下容易成为性能瓶颈


主从Reactor多线程

主从Reactor多线程.png

①Reactor主线程MainReactor对象通过select监听客户端请求时间,收到事件后由Acceptor通过accept处理连接请求,建立连接请求事件
②Acceptor处理建立连接事件后,MainReactor将连接分配给SubReactor进行处理
③SubReactor将连接加入到连接队列进行监听,并创建一个Handler用于处理连接事件
④当新事件发生时,SubReactor会调用连接对应的Handler进行响应。
⑤Handler只负责响应事件,不做业务处理,通过read读取数据后,分发给后面的Worker线程池进行业务处理
⑥Worker线程池分配独立的线程完成真正的业务处理
⑦Handler收到响应结果后通过send将结果返回给client

优点:父线程与子线程数据交互简单,职责明确,父线程只需要接收新连接,子线程完成后续的业务处理

使用场景:Ngnix主从多进程模型,Netty主从多线程模型

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

推荐阅读更多精彩内容