精华内容
下载资源
问答
  • 同步异步阻塞非阻塞

    2015-04-29 10:12:22
    同步异步阻塞非阻塞
  • 主要介绍了JAVA同步异步、阻塞和非阻塞之间的区别,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
  • tcp socket同步 异步 阻塞 非阻塞 的解释.zip 基本概念:同步、异步、阻塞和非阻塞的区别 同步异步阻塞非阻塞的区别 C++ 同步异步阻塞非阻塞的区别
  • 同步 异步 阻塞 非阻塞 区别

    万次阅读 多人点赞 2018-09-25 10:27:27
     前一段时间出去面试,被问到同步异步与阻塞、非阻塞的区别。我一时半会没有想出来,作为一个工作三年的人来说,实在很惭愧。我当时理解同步异步属于两个进程中间的协作关系,例如使用浏览器访问一个网站,需要...

    https://www.cnblogs.com/Anker/p/5965654.html

     

    1、前言

      前一段时间出去面试,被问到同步、异步与阻塞、非阻塞的区别。我一时半会没有想出来,作为一个工作三年的人来说,实在很惭愧。我当时理解同步、异步属于两个进程中间的协作关系,例如使用浏览器访问一个网站,需要多次请求服务端,才能加载完整个页面的内容。同步的操作如下:浏览器首先发送第一个请求,等待服务器回复后,再发送第二个请求,依次类推,直到所有请求完成。异步的操作如下:浏览器发送第一个请求,可以不用等待服务器返回,可以继续发送第二个请求。阻塞与非阻塞属于进程的API执行动作的方式,例如进行需要read数据,阻塞方式操作流程是:如果没有数据,则read会一直等着数据到来,才能进行后续的动作;而非阻塞则是read没有到数据后,则可以进行后续的动作,当有数据的时候再回来读取。通常linux网络API默认都是阻塞的,例如connect、send、recv等。回答后感觉自己心里没有底,底层的关系到底是什么样的,比较虚,没能深入理解。

    2、深入理解分析  

      回来以后,赶紧上网好好查查,加深学习一下。这两个概念在工作中经常用到这些,例如在linux网络IO中涉及到如下模型:

    (1)阻塞式IO

    (2)非阻塞式IO

    (3)IO多路复用

    (4)信号驱动IO

    (5)异步IO

    在知乎上面看到一些解释如下:

    截图如下:

    3、总结

      

      同步和异步针对应用程序来,关注的是程序中间的协作关系;阻塞与非阻塞更关注的是单个进程的执行状态。

    同步:执行一个操作之后,等待结果,然后才继续执行后续的操作。

    异步:执行一个操作后,可以去执行其他的操作,然后等待通知再回来执行刚才没执行完的操作。

    阻塞:进程给CPU传达一个任务之后,一直等待CPU处理完成,然后才执行后面的操作。

    非阻塞:进程给CPU传达任我后,继续处理后续的操作,隔断时间再来询问之前的操作是否完成。这样的过程其实也叫轮询。

       阻塞、非阻塞、多路IO复用,都是同步IO,异步必定是非阻塞的,所以不存在异步阻塞和异步非阻塞的说法。真正的异步IO需要CPU的深度参与。换句话说,只有用户线程在操作IO的时候根本不去考虑IO的执行全部都交给CPU去完成,而自己只等待一个完成信号的时候,才是真正的异步IO。所以,拉一个子线程去轮询、去死循环,或者使用select、poll、epool,都不是异步。

    参考网址:

    https://www.zhihu.com/question/19732473

    https://www.zhihu.com/question/27965282

    http://www.smithfox.com/?e=191

    https://zhuanlan.zhihu.com/p/21416728

    http://blog.csdn.net/dinglang_2009/article/details/50461697

    展开全文
  • Linux的I/O模型介绍以及同步异步阻塞非阻塞的区别(超级重要) 一般来说,Linux下系统IO主要就是通过以下几个函数open(),close(),read(),write(),send(),recv(),lseek(),今天就以recv()为例来介绍下IO模型中的...

                                     ## Linux面试问题汇总

                  Linux的I/O模型介绍以及同步异步阻塞非阻塞的区别(超级重要)

     一般来说,Linux下系统IO主要就是通过以下几个函数open(),close(),read(),write(),send(),recv(),lseek(),今天就以recv()为例来介绍下IO模型中的同步异步,阻塞非阻塞的区别。

    同步、异步

    同步:用户进程发起IO后,进行就绪判断,轮询内核状态。
    异步:用户进程发起IO后,可以做其他事情,等待内核通知。

    阻塞、非阻塞

    阻塞:用户进程访问数据时,如果未完成IO,调用的进程一直处于等待状态,直到IO操作完成。
    非阻塞:用户进程访问数据时,会马上返回一个状态值,无论是否完成,此时进程可以操作其他事情。

    Linux下的五种IO模型

    阻塞I/O(blocking I/O)
    非阻塞I/O(nonblocking I/O)
    I/O复用(select和poll) (I/O multiplexing)
    信号驱动I/O(signal driven I/O (SIGIO))
    异步I/O (asynchronous I/O (the POSIX aio_functions))
    Tip:前四种都是同步,只有最后一种才是异步I/O。

    I/O发生时涉及的对象和阶段

    Linux为了OS的安全性等的考虑,进程是无法直接操作I/O设备的,其必须通过系统调用请求内核来协助完成I/O动作,而内核会为每个I/O设备维护一个buffer。
    对于一个network I/O (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个I/O的process (or thread),另一个就是系统内核(kernel)。当一个read操作发生时,它会经历两个阶段:

    1. 用户进程发起请求,内核接收到请求,从I/O设备中获取数据到buffer,等待数据准备 (Waiting for the data to be ready)
    2. 将buffer中的数据copy到用户进程的地址空间,即将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)
      记住这两点很重要,因为这些I/O Model的区别就是在两个阶段上各有不同的情况。

     

    先说阻塞与非阻塞的区别

    recv()函数默认是阻塞的,什么是阻塞呢?就是当你调用recv()函数时,整个进程或者线程就等待在这里了,直到你recv的fd的所有信息都被send过来,这么做好处就是保证所有信息都能够完整的读取了,但劣势也很明显,就是在recv()的过程中你的进程或线程做不了其它事情,由此,引入了非阻塞IO。


    非阻塞IO是什么呢,还是以recv()函数为例,当你将其设置为非阻塞时,每次当你recv()时,就直接返回,不管信息有没有完全send进来,好处很明显,recv()了之后进程马上能处理下一行代码,坏处也很明显,就是你不知道你的消息是否读完了,这种问题就是TCP中大名鼎鼎的半包问题(解决办法主要是通过一个buffer缓存所有读进来的消息)

     

    从上图可以看到在整个过程中,当用户进程进行系统调用时,内核就开始了I/O的第一个阶段,准备数据到缓冲区中,当数据都准备完成后,则将数据从内核缓冲区中拷贝到用户进程的内存中,这时用户进程才解除block的状态重新运行。

    所以,Blocking I/O的特点就是在I/O执行的两个阶段都被block了。

    从上图可以看到在I/O执行的两个阶段中,用户进程只有在第二个阶段被阻塞了,而第一个阶段没有阻塞,但是在第一个阶段中,用户进程需要盲等,不停的去轮询内核,看数据是否准备好了,因此该模型是比较消耗CPU的。 

    同步与异步的区别

    在POSIX定义中把同步IO操作定义为导致进程阻塞直到IO完成的操作,反之则是异步IO,看概念感觉异步跟非阻塞好像也没有什么区别,要好好理解同步和异步,就要详细说明下IO过程:

    IO过程主要分两个阶段:

    1.数据准备阶段

    2.内核空间复制回用户进程缓冲区空间

    无论阻塞式IO还是非阻塞式IO,都是同步IO模型,区别就在与第一步是否完成后才返回,但第二步都需要当前进程去完成,异步IO呢,就是从第一步开始就返回,直到第二步完成后才会返回一个消息,也就是说,非阻塞能够让你在第一步时去做其它的事情,而真正的异步IO能让你第二步的过程也能去做其它事情。

    这里就在说一下select,poll和epoll这几个IO复用方式,这时你就会了解它们为什么是同步IO了,以epoll为例,在epoll开发的服务器模型中,epoll_wait()这个函数会阻塞等待就绪的fd,将就绪的fd拷贝到epoll_events集合这个过程中也不能做其它事(虽然这段时间很短,所以epoll配合非阻塞IO是很高效也是很普遍的服务器开发模式--同步非阻塞IO模型)。有人把epoll这种方式叫做同步非阻塞(NIO),因为用户线程需要不停地轮询,自己读取数据,看上去好像只有一个线程在做事情,也有人把这种方式叫做异步非阻塞(AIO),因为毕竟是内核线程负责扫描fd列表,并填充事件链表的,个人认为真正理想的异步非阻塞,应该是内核线程填充事件链表后,主动通知用户线程,或者调用应用程序事先注册的回调函数来处理数据,如果还需要用户线程不停的轮询来获取事件信息,就不是太完美了,所以也有不少人认为epoll是伪AIO,还是有道理的。


    I/O复用模型(I/O multiplexing

     I/O multiplexing这个词可能有点陌生,但是如果我说select,poll、epoll,大概就都能明白了。有些地方也称这种I/O方式为event driven I/O,也是实际中使用最多的一种I/O模型。我们都知道,select/epoll的好处就在于单个process就可以同时处理多个网络连接的I/O。它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。它的流程如图:

    从上图可以看到在I/O复用模型中,I/O执行的两个阶段用户进程都是阻塞的,但是两个阶段是独立的,在一次完整的I/O操作中,该用户进程是发起了两次系统调用。 

    I/O multiplexing这个词可能有点陌生,但是如果我说select,poll、epoll,大概就都能明白了。有些地方也称这种I/O方式为event driven I/O,也是实际中使用最多的一种I/O模型。我们都知道,select/epoll的好处就在于单个process就可以同时处理多个网络连接的I/O。它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。
     

    信号驱动I/O模型(Signal-driven I/O

    首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。(signal driven I/O在实际中并不常用)

     

     

    该模型也叫作基于事件驱动的I/O模型,可以看到该模型中,只有在I/O执行的第二阶段阻塞了用户进程,而在第一阶段是没有阻塞的。

    乍看起来感觉和非阻塞模型很相似,其实不同之处就在于,该模型在I/O执行的第一阶段,当数据准备完成之后,会主动的通知用户进程数据已经准备完成,即对用户进程做一个回调。该通知分为两种,一为水平触发,即如果用户进程不响应则会一直发送通知,二为边缘触发,即只通知一次。

     参考链接

    https://blog.csdn.net/a834595603/article/details/94510661

    https://blog.csdn.net/yxtxiaotian/article/details/84068839#2.7%C2%A05%E7%A7%8DI%2FO%E6%A8%A1%E5%9E%8B%E6%AF%94%E8%BE%83

    https://blog.csdn.net/zk3326312/article/details/79400805

    展开全文
  • 在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞。 就绪(Ready)状态:当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪...

    一、状态介绍

     

     

     

    Python资源共享群:484031800

    在了解其他概念之前,我们首先要了解进程的几个状态。在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞。

    就绪(Ready)状态:当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。

    执行/运行(Running)状态当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。

    阻塞(Blocked)状态正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。

     

     

     

     

    二、同步和异步

    所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。

    所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列。

    2.1 例子

    比如我去银行办理业务,可能会有两种方式:

    第一种 :选择排队等候;

    第二种 :选择取一个小纸条上面有我的号码,等到排到我这一号时由柜台的人通知我轮到我去办理业务了;

    第一种:前者(排队等候)就是同步等待消息通知,也就是我要一直在等待银行办理业务情况;

    第二种:后者(等待别人通知)就是异步等待消息通知。在异步消息处理中,等待消息通知者(在这个例子中就是等待办理业务的人)往往注册一个回调机制,在所等待的事件被触发时由触发机制(在这里是柜台的人)通过某种机制(在这里是写在小纸条上的号码,喊号)找到等待该事件的人。

    三、阻塞和非阻塞

    阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或者异步)时的状态有关。也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的

    3.1 例子

    继续上面的那个例子,不论是排队还是使用号码等待通知,如果在这个等待的过程中,等待者除了等待消息通知之外不能做其它的事情,那么该机制就是阻塞的,表现在程序中,也就是该程序一直阻塞在该函数调用处不能继续往下执行。

    相反,有的人喜欢在银行办理这些业务的时候一边打打电话发发短信一边等待,这样的状态就是非阻塞的,因为他(等待者)没有阻塞在这个消息通知上,而是一边做自己的事情一边等待。

    注意:同步非阻塞形式实际上是效率低下的,想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有。如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的;而异步非阻塞形式却没有这样的问题,因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换。

    四、同步/异步和阻塞/非阻塞

    4.1 同步阻塞形式

    效率最低。拿上面的例子来说,就是你专心排队,什么别的事都不做。

    4.2 异步阻塞形式

    如果在银行等待办理业务的人采用的是异步的方式去等待消息被触发(通知),也就是领了一张小纸条,假如在这段时间里他不能离开银行做其它的事情,那么很显然,这个人被阻塞在了这个等待的操作上面。

    异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞。

    4.3 同步非阻塞形式

    实际上是效率低下的。

    想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有,如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的。

    4.4 异步非阻塞形式

    效率更高,

    因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换。

    比如说,这个人突然发觉自己烟瘾犯了,需要出去抽根烟,于是他告诉大堂经理说,排到我这个号码的时候麻烦到外面通知我一下,那么他就没有被阻塞在这个等待的操作上面,自然这个就是异步+非阻塞的方式了。

    很多人会把同步和阻塞混淆,是因为很多时候同步操作会以阻塞的形式表现出来,同样的,很多人也会把异步和非阻塞混淆,因为异步操作一般都不会在真正的IO操作处被阻塞。

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


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

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


    作者:愚抄
    链接:https://www.zhihu.com/question/19732473/answer/23434554
    来源:知乎
    著作权归作者所有,转载请联系作者获得授权。
    展开全文
  • 作者:知乎用户 ... 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,商业转载请注明出处。...阻塞就是 recv/read的时候 socket接收缓冲区要是有数据就读, 没数据我就一直睡觉赖着不走,直到有数据来了
  • 同步异步阻塞非阻塞是一些非常常见的概念,但是对于开发者来说往往是用到了很难说清楚。 笔者专门整理了下这方面的概念,作此文以记之。 这部分内容可能存在一些争议,如有不同意见欢迎评论交流。 概念 个人理解...
  • 同步异步/阻塞非阻塞

    千次阅读 多人点赞 2019-05-27 16:47:05
    同步异步是针对应用程序与内核的交互而言。也就是上图的read操作,从缓存中读取数据,如果缓存中数据还没有准备好,如果是同步操作,它会一直等待,直到操作完成。如果是异步操作,那么它会去做别的事情,等待数据...
  • 相信很多人都会弄混这些概念,甚至...这里先给你一个概念:同步异步是个操作方式,阻塞非阻塞是线程的一种状态。同步:一个功能调用时,没有得到结果之前,就不会返回,可以说是一种操作方式。参考线程同步,我访问这...
  • 同步异步阻塞非阻塞 个人认为同步和异步是更抽象的概念,是相对的任务而言的。而阻塞和非阻塞就就字面的意思是对当前的进程或线程而言的。 概念之间的区别同步与异步 同步与异步在不同的场景下有不同的概念,在...
  • 主要介绍了详解socket阻塞与非阻塞同步异步、I/O模型,socket网络编程中的同步,异步,阻塞式,非阻塞式,有何联系与区别,本文将详细讲诉。
  • 同步(synchronous):同步就是顺序执行,执行完...异步是让调用方法的主线程不需要同步等待另一线程的完成,从而可以让主线程干其它的事情。 阻塞阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果
  • 同步异步阻塞非阻塞,I/O学习总结的思维导图,需要结合Richard Stevens的书来学习
  • 大家做socket编程时,经常会遇到同步 异步 阻塞 非阻塞这种术语,很混乱,大家的解释也是千奇百怪,下面就说下我的理解。 应该把它们拆分开来,同步异步是一个维度,阻塞与非阻塞是一个维度。 从数据通信角度...
  • 同步异步、阻塞、非阻塞IO总结(IO模型总结)

    万次阅读 多人点赞 2019-04-09 22:51:53
    知识点概念IO操作概念同步异步(IO模型中的概念,并非并发模式中的同步异步)阻塞、非阻塞同步IO模型异步IO模型读写(read write)与阻塞和非阻塞各种IO模型异同对比 IO操作概念 在Unix系统中,一切都是文件。...
  • 异步同步、阻塞、非阻塞的说明和解释,用于深入理解。
  • 同步异步,阻塞和非阻塞是大家经常会听到的概念,但是它们是从不同维度来描述一件事情,常常很容易混为一谈。 1. 同步异步 同步异步描述的是消息通信的机制。 同步 当一个request发送出去以后,会得到一个...
  • 理解同步异步阻塞非阻塞的区别

    千次阅读 2019-01-09 10:44:46
    同步异步阻塞非阻塞的概念对于很多初学者来说是一个模糊的概念,其实我们的生活中存在着很多同步和异步的例子。 同步和异步关注的是消息通信机制 在计算机领域,同步就是指一个进程在执行某个请求的时候,若该...
  • 同步异步阻塞非阻塞详解

    千次阅读 2019-05-21 18:22:56
    场景:厕所排队 一个厕所并且只有一个坑位,有十几个人排队,你排在第二的位置,你一离开,就得重新排队! 1.你需要一直盯着厕所门,查看里面的人是否...(这里极为容易混淆同步阻塞关系) 自己反复查看->同步 坑...
  • 同步/异步, 阻塞/非阻塞分别是什么? 本篇文章想简单谈谈. 同步/异步 当请求一个方法时, 调用者需要等待该方法执行完成, 且该方法会返回执行结果, 则对于调用者来说就是"同步"的. 当请求一个方法时, 调用者...
  • 所谓阻塞非阻塞,仅仅对于老张而言。 一直等的老张是阻塞;看电视的老张是非阻塞。情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非...
  • 简单理解什么是同步阻塞/同步非阻塞异步阻塞/异步非阻塞 举个栗子 1、你在家做饭,用普通的汤锅,米放进去,就站在锅边,傻等饭熟。——这叫同步阻塞 是不是觉得浪费了大量的时间,于是你想提高时间的利用效率。 2...
  • 1 同步异步# 首先来解释同步异步的概念,这两个与消息的通知机制有关。也就是同步异步主要是从消息的通知机制角度来说的。 1.1 概念描述## 所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被...
  • 阻塞:用户进程访问数据时,如果未完成IO,等待IO操作完成或者进行系统调用来判断IO是否完成非阻塞:用户进程访问数据时,会马上返回一个状态值,无论是否完成同步:用户进程发起IO(就绪判断)后,轮询内核状态异步:...
  • 阻塞非阻塞区别1. 同步&异步2. 阻塞&非阻塞. 几种IO分类3.1. 同步阻塞IO3.2. 同步非阻塞IO3.3. IO多路复用(Reactor模式)3.4. 异步IO(Proactor模式) 1. 同步&异步 同步异步:关心的是消息通知机制 ...
  • 同步异步 阻塞非阻塞:废话不说,老张爱喝茶,煮开水,有两个水壶,普通水壶,响水壶(水开会提示)(引自)同步就是普通水壶烧开水,要没事儿自己过来来看开没开;异步就是响水壶烧开水,水开了水壶响了通知你。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 125,850
精华内容 50,340
关键字:

同步异步阻塞非阻塞