IO模式与现实中的例子

Wesley13
• 阅读 760

前言

关于IO模式的区别,网络上的文章一搜一大把,但每次阅读时总觉得相当晦涩而且老容易混淆,俗话说好记性不如烂笔头,所以干脆自己写一篇便于自己理解的文章以此帮助记忆和理解,不对之处还请轻喷,先谢谢!

  1. 同步阻塞IO(Blocking IO)BIO
  2. 同步非阻塞IO(Non-blocking IO)
  3. IO多路复用(IO Multiplexing)注意: 它也是同步的,又叫New IO,即NIO
  4. 异步IO(Asynchronous IO)AIO

一、何谓阻塞?何谓同步?

如何区别同步IO还是异步IO,是阻塞IO还是非阻塞IO,主要区别是IO过程中其实是存在2个过程:1.发起IO过程 2.实际IO过程,如果过程1是需要等待的,那么就是属于阻塞IO,反之则是非阻塞IO,如果过程2中是需要等待的,那么就是同步IO,反之则是属于异步IO,为啥都是等待的,一个叫阻塞一个叫同步呢?个人理解是这样的:IO过程发生在AB之间,A相当于用户线程或者网络客户端,B相当于系统线程或者网络服务端,AB之间的访问、调用过程分阻塞or非阻塞,但是真正的一个完整的IO过程其实是由C参与的,这个C才是真正IO的主体,相当于操作系统、数据库等,那么B和C之间的存取、读写过程分同步or异步

二、举个栗子

阻塞or非阻塞,这个生活中最好理解的就是你要买东西,_是你自己去买还是让你弟弟去买_,你自己去买就是阻塞,让你弟弟买回来再给你就是非阻塞,你弟弟买的时候你可以干其他事情( 怎么买的你先别管)

同步or异步,还是举上面那个例子,同步IO,是得你自己(阻塞)or你弟弟(非阻塞)不断去京东网站上查询物流到哪里了?到了就你自己(阻塞)or你弟弟(非阻塞)跑去拿,典型的例子就是**京东自提,异步IO呢?就是你网店下好单之后就甭管了,快递员会自动把货送到你或者你弟弟手上,典型的例子就是京东送货上门**

说到这里应该很多同学都应该能瞬间秒懂这几个模式的区别了

上面BIO, NBIO,以及NIO都是同步的IO(后2者只是没有阻塞发起方),只有AIO才是真正异步的IO,Java也是在1.7才开始支持AIO,Tomcat容器在AIO上实现叫APR,基于Native Library实现异步

三、重点谈谈NIO

很早以前Java和Tomcat就支持了BIO,这种模式最简单,但是效率也最差,显而易见大量时间都耗费在了等待IO上,而IO又正好是极其耗费时间的,所以现在基本上都是New IO(NIO) ,AIO由于实现相当复杂还必须有操作系统支持,(据说Netty的AIO实现比NIO效率还慢,所以放弃了,我没详细了解过)所以现在并没有NIO普及,这里重点讨论一下NIO吧,NIO即经典的Reactor模式(Reactor最近是火哦)

好,还是从生活中的例子入手吧,NIO是同步非阻塞+复用链接,你跟你弟弟说:我要买鼠标,然后小姐姐说:弟,我也要!,弟弟说:好,下单!,你跟小姐姐去逛街去了,你弟弟就不停的隔段时间查询下网站,突然发现小姐姐的快递已经到家了,马上通知小姐姐:姐!你快递到了!,小姐姐立刻马上结束逛街回到家领快递,1个小时后你弟弟又告诉你说你的快递到了,你又立刻拿了快递,结束。

从这个例子可以看出,你弟弟其实是一个蛮重要的角色,对!没错,他就是NIO模式中的Reactor,负责查询物流信息(select channel and read socket),发现socket可读之后通知用户线程读取数据,所以从tomcat开启NIO后吞吐量大增的现象就可以发现,每个请求就像一个个的小姐姐,tomcat里有个小弟弟在轮训等待IO结果并负责通知小姐姐结果。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java的BIO,NIO,AIO
  Java中的IO操作可谓常见。在Java的IO体系中,常有些名词容易让人困惑不解。为此,先通俗地介绍下这些名词。  1什么是同步?  2什么是异步?  3什么是阻塞?  4什么是非阻塞?  5什么是同步阻塞?  6什么是同步非阻塞?  7什么是异步阻塞?  8
Wesley13 Wesley13
3年前
NIO
1、简介1.1Java中的IO介绍1.BIO:BlockingIO,同步式阻塞式IO,即传统的IO,是java中最早期的流2.NIO:NonBlockingIO,又称NewIO,同步式非阻塞IO,是JDK1.4提供的流3.AIO:AsynchronousIO,异步是非阻塞IO,可以认为是NIO的二代版
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Eureka Server 开启Spring Security Basic认证
!Desktop(https://uploadimages.jianshu.io/upload_images/98242475ce94f98ae00f42f.jpg?imageMogr2/autoorient/strip%7CimageView2/2/w/1240)文章共503字,阅读大约需要2分钟!概述
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这