精华内容
下载资源
问答
  • 五分钟掌握同步异步I/O同步阻塞同步非阻塞异步阻塞异步非阻塞网络通讯原理网络通讯的过程I/O阻塞I/O模型非阻塞I/O模型多路复用I/O模型信号驱动I\O模型异步I/O模型易于混淆的概念各I/O模型的对比与总结BIO、NIO、AIO ...

    网络通讯原理

    在讲I\O的时候,先简单讲下网络通讯原理。
    网络通讯四要素:本机的IP地址、子网掩码、网关的IP地址和DNS的IP地址。
    四要素有两种方式:一是静态获取,即手动配置;二是动态获取,即通过DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)获取

    网络通讯的过程

    • 浏览器解析网址(IP地址+协议+端口号),通过访问DNS域名系统服务器(基于UDP)获得IP地址
    • 生成HTTP消息并转交给Socket抽象层
    • 再经过传输层,网络层,链路层等。细节先省略。可以参照:网络通讯的的整体流程
      在这里插入图片描述
      Socket起源于UNIX,在UNIX“一切皆文件”的哲学思想下,Socket是一种从打开,到完成读、写操作,最后关闭的模式,服务器和客户端各自维护一个“文件”,在建立连接打开文件后,可以向自己的文件写入内容供对方读取或者读取对方的内容,通信结束时关闭文件。

    I/O

    用户进程中的一次完整I/O交互流程分为两阶段,首先是经过内核空间,也就是由操作系统处理;紧接着就是到用户空间,也就是交由应用程序。
    在这里插入图片描述
    通俗地将,可以将I/O分为两步:第一步是等待;第二步是数据搬迁。

    阻塞I/O模型

    阻塞I/O模型特点:在I\O执行的两个阶段(等待数据和拷贝数据)都被阻塞。
    下图中红色部分都是阻塞。
    典型应用:阻塞Socket、Java BIO
    优点:阻塞挂起不消耗CPU资源
    在这里插入图片描述

    非阻塞I/O模型

    相比较阻塞I/O,多了一个轮询访问内核是否存在。
    典型应用:Socket设置NON_BLOCK
    缺点:轮询调用,消耗CPU资源
    在这里插入图片描述

    多路复用I/O模型

    多路复用I/O模型和阻塞I/O模型并没有太大的不同,事实上,还更差一些,因为这里需要使用两次系统调用(select和recvfrom),而阻塞I/O模型只有一次系统调用(recvfrom)。但是,用Selector的优势在于它可以同时处理多个连接,所以如果处理的连接数不是很多,多路复用I\O模型并不一定比使用多线程加阻塞I\O性能要好,可能延时更大。优势在于能处于更多的连接。
    典型应用:Java NIO,Nginx(epoll,poll,select)
    在这里插入图片描述

    信号驱动I\O模型

    信号驱动I/O是指进程预先告知内核,向内核注册一个信号处理函数,然后用户进程返回不阻塞,当内核数据就绪时会发送一个信号给进程,用户进程便在信号处理函数中调用I/O读取数据。
    应用场景比较少。
    在这里插入图片描述

    异步I/O模型

    工作机制:告知内核启动某个操作,并让内核在整个操作完成后通知我们。
    与信号驱动I/O模型的区别:信号驱动I/O模型是由内核通知我们何时可以启动一个I/O操作,这个I/O操作由用户自定义的信号函数来实现,而异步I/O模型由内核告知我们I/O操作何时完成
    典型应用:Java 7 AIO,高性能服务器应用
    不阻塞,数据一步到位,采用Proactor模式
    缺点:需要操作系统底层支持,Linux2.5内核首现 2.6产的内部标准特性
    在这里插入图片描述

    易于混淆的概念

    • 同步阻塞
    • 同步非阻塞
    • 异步阻塞
    • 异步非阻塞

    同步和异步的区别:
    同步:应用程序主动发起请求询问状态(轮询)
    异步:服务方会主动通知请求方
    在这里插入图片描述
    阻塞和非阻塞的区别:
    阻塞:等待返回数据之前,当前的线程是挂起状态
    非阻塞:等待返回数据之前,当前的线程是运行状态,可以继续处理其他任务
    在这里插入图片描述

    列子:

    (1)这个时候,如果我们一直在店里面什么都不干,一直等待直到洗完照片,这个过程就叫同步阻塞。
    (2)当然,大部分人很少这么干,更多的是大家拿起手机开始看电视,看一会儿就会问老板洗完没,老板说没洗完,然后接着看,再过一会儿接着问,直到照片洗完,这个过程就叫同步非阻塞。
    (3)由于店里生意太好了,越来越多的人过来拍,店里面快没地方坐了,老板说你把手机号留下,我一会儿洗好了就打电话告诉你过来取,然后你去外面找了一个长凳开始躺着睡觉等待老板打电话,什么都不干,这个过程就叫异步阻塞(实际不应用)。
    (4)当然实际情况是,大家可能会先去逛街或者吃饭,或者做其他活动,这样一来,两不耽误,这个过程就叫异步非阻塞(效率最高)。

    各I/O模型的对比与总结

    阻塞程度:阻塞I/O>非阻塞I/O>多路复用I/O>信号驱动I/O>异步I/O,效率是由低到高的。
    在这里插入图片描述

    BIO、NIO、AIO

    BIO:一个连接只用一个线程来处理。
    NIO:单线程管理多个连接。缓冲区(Buffer)、选择器(Selector)和通道(Channel)
    AIO:异步I/O,把I/O读写操作完全交给操作系统。操作系统主动通知实现异步。

    BIO NIO AIO
    面向流 面向缓冲区 操作系统主动通知用户线程
    阻塞I\O 非阻塞I\O Proactor设计模式

    参考资料
    [1]: Netty 4核心原理与手写RPC框架实战

    展开全文
  • 同步非阻塞(NIO):客户端发送请求给服务器。服务器需要很长的时间去执行,客户端会一直等待结果返回,不会去做任何事前,而服务器会处理其他的请求,过一会回来处理原先的请求,之后返回结果给客户端,客户端继续...
    同步阻塞(BIO):客户端发送请求给服务端,服务端需要很长的时间去执行,客户端会一直等待结果返回,也不会去做任何事情,服务器也不会处理其他的请求。
    同步非阻塞(NIO):客户端发送请求给服务器。服务器需要很长的时间去执行,客户端会一直等待结果返回,不会去做任何事前,而服务器会处理其他的请求,过一会回来处理原先的请求,之后返回结果给客户端,客户端继续执行。
    异步阻塞:客户端发送请求给服务端,服务端需要很长的时间去执行,客户端会去执行其他任务,而服务器不会处理其他请求,知道处理完本次请求。返回结果给客户端,客户端执行回调函数。
    异步非阻塞(AIO):客户端发送请求给服务端,服务端需要很长的时间去执行,客户端会先去执行回调函数,服务器也会接受并处理请求,过一会回来处理原先的请求,之后返回结果给客户端,客户端继续执行
    
    展开全文
  • 在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解。具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞?...6 什么是同步非阻塞? 7 什么是异步阻塞? 8

    【转自】http://qindongliang.iteye.com/blog/2018539
    在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解。具体如下:
    序号 问题
    1 什么是同步?
    2 什么是异步?
    3 什么是阻塞?
    4 什么是非阻塞?
    5 什么是同步阻塞?
    6 什么是同步非阻塞?
    7 什么是异步阻塞?
    8 什么是异步非阻塞?

    散仙不才,在查了一部分资料后,愿试着以通俗易懂的方式解释下这几个名词。如有不足之处,还望告知。

    在弄清楚上面的几个问题之前,我们首先得明白什么是同步,异步,阻塞,非阻塞,只有这几个单个概念理解清楚了,然后在组合理解起来,就相对比较容易了。

    1,同步和异步是针对应用程序和内核的交互而言的。

    2,阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。

    由上描述基本可以总结一句简短的话,同步和异步是目的,阻塞和非阻塞是实现方式。

    编号 名词 解释 举例
    1 同步 指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪 自己上街买衣服,自己亲自干这件事,别的事干不了。
    2 异步 异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知(异步的特点就是通知) 告诉朋友自己合适衣服的尺寸,大小,颜色,让朋友委托去卖,然后自己可以去干别的事。(使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS)
    3 阻塞 所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待 状态, 直到有东西可读或者可写为止 去公交站充值,发现这个时候,充值员不在(可能上厕所去了),然后我们就在这里等待,一直等到充值员回来为止。(当然现实社会,可不是这样,但是在计算机里确实如此。)
    4 非阻塞 非阻塞状态下, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待, 银行里取款办业务时,领取一张小票,领取完后我们自己可以玩玩手机,或者与别人聊聊天,当轮我们时,银行的喇叭会通知,这时候我们就可以去了。

    下面我们再来理解组合方式的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读取或者写入操作已经由内核完成了。

    BIO、NIO、AIO适用场景分析:
    ① BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
    ②NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
    ③AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

    搞清楚了以上概念以后,我们再回过头来看看,Reactor模式和Proactor模式。

    (其实阻塞与非阻塞都可以理解为同步范畴下才有的概念,对于异步,就不会再去分阻塞非阻塞。对于用户进程,接到异步通知后,就直接操作进程用户态空间里的数据好了。)

    首先来看看Reactor模式,Reactor模式应用于同步I/O的场景。我们分别以读操作和写操作为例来看看Reactor中的具体步骤:
    读取操作:
    1. 应用程序注册读就绪事件和相关联的事件处理器

    1. 事件分离器等待事件的发生

    2. 当发生读就绪事件的时候,事件分离器调用第一步注册的事件处理器

    3. 事件处理器首先执行实际的读取操作,然后根据读取到的内容进行进一步的处理

    写入操作类似于读取操作,只不过第一步注册的是写就绪事件。

    下面我们来看看Proactor模式中读取操作和写入操作的过程:
    读取操作:
    1. 应用程序初始化一个异步读取操作,然后注册相应的事件处理器,此时事件处理器不关注读取就绪事件,而是关注读取完成事件,这是区别于Reactor的关键。

    1. 事件分离器等待读取操作完成事件

    2. 在事件分离器等待读取操作完成的时候,操作系统调用内核线程完成读取操作(异步IO都是操作系统负责将数据读写到应用传递进来的缓冲区供应用程序操作,操作系统扮演了重要角色),并将读取的内容放入用户传递过来的缓存区中。这也是区别于Reactor的一点,Proactor中,应用程序需要传递缓存区。

    3. 事件分离器捕获到读取完成事件后,激活应用程序注册的事件处理器,事件处理器直接从缓存区读取数据,而不需要进行实际的读取操作。

    Proactor中写入操作和读取操作,只不过感兴趣的事件是写入完成事件。

    从上面可以看出,Reactor和Proactor模式的主要区别就是真正的读取和写入操作是有谁来完成的,Reactor中需要应用程序自己读取或者写入数据,而Proactor模式中,应用程序不需要进行实际的读写过程,它只需要从缓存区读取或者写入即可,操作系统会读取缓存区或者写入缓存区到真正的IO设备.
    综上所述,同步和异步是相对于应用和内核的交互方式而言的,同步 需要主动去询问,而异步的时候内核在IO事件发生的时候通知应用程序,而阻塞和非阻塞仅仅是系统在调用系统调用的时候函数的实现方式而已。

    如果你想吃一份宫保鸡丁盖饭:

    同步阻塞:你到饭馆点餐,然后在那等着,还要一边喊:好了没啊!

    同步非阻塞:在饭馆点完餐,就去遛狗了。不过溜一会儿,就回饭馆喊一声:好了没啊!

    异步阻塞:遛狗的时候,接到饭馆电话,说饭做好了,让您亲自去拿。

    异步非阻塞:饭馆打电话说,我们知道您的位置,一会给你送过来,安心遛狗就可以了。

    “一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作。
    同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO。
    阻塞IO和非阻塞IO的区别在于第一步,发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。

    同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。而阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。
    所以,IO操作可以分为3类:同步阻塞(即早期的IO操作)、同步非阻塞(NIO)、异步(AIO)。
    同步阻塞:
    在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。JAVA传统的IO模型属于此种方式。

    同步非阻塞:
    在此种方式下,用户进程发起一个IO操作以后边可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。其中目前JAVA的NIO就属于同步非阻塞IO。
    异步:
    此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序。”

    这段话比较清楚

    展开全文
  • 老张爱喝茶,废话不说,煮开水。...(同步非阻塞) 老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。 3 老张把响水壶放到火上,立等水开。(异步阻...

    老张爱喝茶,废话不说,煮开水。
    出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
    1 老张把水壶放到火上,立等水开。(同步阻塞)
    老张觉得自己有点傻
    2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)
    老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。
    3 老张把响水壶放到火上,立等水开。(异步阻塞)
    老张觉得这样傻等意义不大
    4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)
    老张觉得自己聪明了。

    所谓同步异步,只是对于水壶而言。
    普通水壶,同步;响水壶,异步。
    虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。
    同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。

    所谓阻塞非阻塞,仅仅对于老张而言。
    立等的老张,阻塞;看电视的老张,非阻塞。
    情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用

    展开全文
  • 我喜欢一个女孩,于是每天就盯着屏幕守候在手机...后来发现一心二用太tm累了,于是乎主要干着自己的工作,喜欢的女孩来电提醒我再去关注----异步非阻塞   同步和异步区别:相当于状态的变化是又我主动发现还是...
  • 同步异步阻塞非阻塞

    2015-04-29 10:12:22
    同步异步阻塞非阻塞
  • 同步阻塞,同步非阻塞,异步阻塞,异步非阻塞区别和关系
  • 简单理解什么是同步阻塞/同步非阻塞,异步阻塞/异步非阻塞 举个栗子 1、你在家做饭,用普通的汤锅,米放进去,就站在锅边,傻等饭熟。——这叫同步阻塞 是不是觉得浪费了大量的时间,于是你想提高时间的利用效率。 2...
  • 同步异步 阻塞非阻塞

    2020-01-29 10:50:12
    有些文章将这四个作了两两组合,于是就有了:异步阻塞和异步非阻塞,可以明确的说,这完全是牵强之理解,无论<Unix网络编程>一书中所列的I/O模式,还是POSIX标准,都没有提这两个概念。异步就是异步!只有同步...
  • tcp socket同步 异步 阻塞 非阻塞 的解释.zip 基本概念:同步、异步、阻塞和非阻塞的区别 同步异步与阻塞非阻塞的区别 C++ 同步异步与阻塞非阻塞的区别
  • 网上闲逛技术贴,看见一个关于理解同步阻塞、同步非阻塞、异步阻塞、异步非阻塞比较风趣的故事,简单明了,很容易理解,因此记录一下,希望更多人能看见。 故事原文: 老张爱喝茶,废话不说,煮开水。出场人物:老张...
  • 同步异步 阻塞非阻塞 理解前言同步 vs 异步同步异步总结阻塞 vs 非阻塞基本概念阻塞非阻塞总结总结NIO为什么是同步非阻塞?其他 前言 对同步异步 阻塞非阻塞做一下简单的总结 同步 vs 异步 同步 调用方被调用方发起...
  • Java 同步与异步-阻塞与非阻塞理解Java 中同步与异步,阻塞与非阻塞都是用来形容交互方式,区别在于它们描述的是交互的两个不同层面。同步与异步同步与异步更关注交互双方是否可以同时工作。以同步的方式完成任务...
  • 针对接收方发送方接收方发送方处理接收方处理同步阻塞等待接收方返回等待处理结果返回发送方同步非阻塞等待接收方返回不等待处理结果,去做其他事情异步阻塞不等待接受方返回等待处理结果返回发送方异步非阻塞不等待...
  • 同步异步阻塞非阻塞杂记

    万次阅读 2017-11-10 12:19:18
    gevent实现的协程是同步非阻塞还是异步非阻塞? gevent是一个使用完全同步编程模型的可扩展的异步I/O框架。 IO是不是阻塞的和协程是没有关系的,python本来就能支持非阻塞IO, 比如在linux只要用API,更改了...
  • 阻塞 排队买东西 在排队的过程中不能做其他事情 非阻塞 我在排队的过程中还可以玩手机 聊天等 同步 你等待事件返回结果 异步 不用等待事件返回结果 事件会主动回调你 ...
  • 同步和异步、阻塞和非阻塞同步和异步关注的是消息通信机制.同步是指: 发送方发出数据后, 等待接收方发回响应后才发下一个数据包的通讯方式. 就是在发出一个调用时, 在没有得到结果之前, 该调用就不返回, 但是一旦...
  • 在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解。具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞?...什么是异步非阻塞? 散仙
  • 并行,并发,串行,同步,异步,阻塞,非阻塞,同步阻塞,同步非阻塞,异步阻塞,异步非阻塞 并行和并发 并发和并行从宏观上来讲都是同时处理多路请求的概念。但并发和并行又有区别,并行是指两个或者多个事件...
  •  在比较这两个模式之前,我们首先的搞明白几个概念,什么是阻塞和非阻塞,什么是同步和异步,同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而...
  • 同步阻塞, 同步非阻塞,异步阻塞,异步非阻塞   我们同意一个幼儿园接小朋友放学的列子,这里定义如下: 家长n个,小朋友n个,管理员1个。家长接小朋友需要根据接送牌的。整个流程是:因为只有一个管理员,所以...
  • 面试问我同步、异步、阻塞非阻塞,答的并不是很好,回来后必然要出一篇博文加深印象了
  • 从进程级来看,同步与阻塞、异步非阻塞是同义词,从计算机系统层面则有以下差别: 阻塞非阻塞 同步异步 等待数据是否会阻塞进程 数据拷贝时是否会阻塞进程 阻塞IO 非阻塞IO 用户进程进入 ...
  • 1、同步、异步、阻塞、非阻塞理解? 1.1、同步与异步 ​ 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication) ​ 同步:当发出一个调用时,在没有得到返回之前,该调用就...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,238
精华内容 6,895
关键字:

异步阻塞异步非阻塞