看完就明白什么是同步/异步、阻塞/非阻塞

  相信干IT的或多或少都听说过同步、异步、阻塞、非阻塞这四个词,它们也可以分成两对,也就是同步、异步一对,阻塞、非阻塞一对,这个看词义就很好理解。关键问题在于同步和阻塞、异步和非阻塞之间的区别,很多人对这两组概念有点分不清,感觉意思差不多,其实它们描述的是两个不同的问题,我们用一个具体的场景来描述一下这四个词,用真实的生活场景感受一下它们的不同。

  我们应该都有过去银行柜台办理业务的经历,当人很多的时候往往要排队等待,那么这时候就可能出现这四种情况:

  在柜台前排队一直等在那里办理业务(同步),在等到办理业务前不做任何其他事情(阻塞);

  在柜台前排队一直等在那里办理业务(同步),在等到办理业务前做其他事情,比如玩手机,玩手机的时候需要不时地去看是否已经排队排到了(非阻塞);

  去取号机上拿个号,当轮到办理业务的时候会叫号,不用一直等在那里(异步),在叫号办理业务前不做任何其他事情(阻塞);

  去取号机上拿个号,当轮到办理业务的时候会叫号,不用一直等在那里(异步),在叫号办理业务前做其他事情,比如玩手机,玩手机的时候不用关心是否排队排到了,因为会叫号通知我(非阻塞);  

  通过去银行柜台办理业务的场景我们可以发现同步/异步、阻塞/非阻塞之间关注的点不一样,同步/异步关注的是消息如何通知,在上面那个场景里就是两种不同的通知方式:同步通知方式是由排队人一直等消息,异步通知方式是由叫号机发送消息来通知,排队人无需关注消息,这是同步/异步之间的主要区别。阻塞/非阻塞关注的是等待消息通知时的状态,阻塞的时候排队人的状态不变一直等着,非阻塞的时候可以变成其他非等待状态,如看手机,出去抽烟等。需要特别说明一下的是同步非阻塞这种状态,可以发现在做其他事情的时候需要不停的检查等待结果,所以这里存在一个任务切换引起的资源消耗问题。

  现在我们来总结一下同步/异步、阻塞/非阻塞之间的区别:同步和异步仅仅是关注的消息如何通知的机制,而阻塞与非阻塞关注的是等待消息通知时的状态。也就是说,同步的情况下,是由处理消息者自己去等待消息是否被触发,而异步的情况下是由触发机制来通知处理消息者。

  相信看完上文你已经基本搞清楚同步/异步、阻塞/非阻塞的概念了,接下来我们通过一个生活实例来巩固复习一下,看看自己是否真的已经掌握。

  平时大家都会上网下载一些东西,这里就假设我要下载一个视频,我们用这个场景再来复习一下同步/异步、阻塞/非阻塞的概念:

  我通过看下载精度条等待下载完成的结果(同步),期间不做其他事情(阻塞)

  我通过看下载精度条等待下载完成的结果(同步),期间去聊QQ,在聊QQ的时候不停地去看下载是否完成(非阻塞)

  通过下载完成的提示音通知得到下载完成的结果(异步),期间不做其他事情(阻塞)

  通过下载完成的提示音通知得到下载完成的结果(异步),期间去聊QQ,在聊QQ的时候不需要去看下载是否完成,因为下载完了提示音会通知我(非阻塞)

  最后,需要注意理解的是“消息通知机制”和“等待消息通知时的状态”这两个概念,这是理解同步/异步、阻塞/非阻塞四个概念的关键所在。还有我们在讨论这四个概念的时候一定要放在同一个层级,比如操作系统级别,框架级别,业务代码级别等,因为一个事件在不同层级所属的性质不一定一样,只有在同一个层级,才能去讨论它的性质是同步/异步还是阻塞/非阻塞。

原文地址:https://www.cnblogs.com/muxuanchan/p/9771966.html

时间: 2024-10-28 22:44:50

看完就明白什么是同步/异步、阻塞/非阻塞的相关文章

【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)

网上有很多讲同步/异步/阻塞/非阻塞/BIO/NIO/AIO的文章,但是都没有达到我的心里预期,于是自己写一篇出来. 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数据,然后使用适合的视图展示详情数据. 如果网速很慢,代码发起一个HTTP请求后,就卡住不动了,直到十几秒后才拿到HTTP响应,然后继续往下执行. 这个时候你问别人,刚刚代码发起的这个请求是不是一个同步请求,对方一定回答是.这是对的,它确实是. 但你要问它为什么是呢?对方一定是这样回答的,“因为发起请

同步/异步与阻塞/非阻塞

一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如sin isdigit等).但是一般而言,我们在说同步.异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务.最常见的例子就是 SendMessage.该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回.当对方处理完毕以后,该函数才把消息处理函数所返回的值返回给调用者. B.

深入理解同步/异步与阻塞/非阻塞区别 (转)

转载自:http://chuansong.me/n/2124760 几年前曾写过一篇描写同步/异步以及阻塞/非阻塞的文章,最近再回头看,还存在一些理解和认知误区,于是重新整理一下相关的概念,希望对网络编程的同行能有所启发. 同步与异步 首先来解释同步和异步的概念,这两个概念与消息的通知机制有关. 举个例子,比如一个用户去银行办理业务,他可以自己去排队办理,也可以叫人代办,办完之后再告知用户结果.对于要办理这个银行业务的人而言,自己去办理是同步方式,而别人代办完毕再告知则是异步方式. 两者的区别在

(转)同步异步/阻塞非阻塞 和 5种linux网络通信模型

会阻塞的函数:connect, accept,send/recv/sendto/recvfrom等读写函数. 不会阻塞的函数:bind, listen,socket, closesocket. linux网络通信模型有: 阻塞IO模型(同步),非阻塞IO模型(拷贝同步),IO复用模型(多线程同步),信号驱动IO模型((拷贝同步),异步IO模型(异步). node.js对同步/异步,阻塞非阻塞的解释: 线程在执行中如果遇到磁盘读写或网络通信(统称为I/O 操作),通常要耗费较长的时间,这时 操作系

高性能IO设计模式之阻塞/非阻塞,同步/异步解析

提到高性能,我想大家都喜欢这个,今天我们就主要来弄明白在高性能的I/O设计中的几个关键概念,做任何事最重要的第一步就是要把概念弄的清晰无误不是么?在这里就是:阻塞,非阻塞,同步,异步. OK, 现在来具体看看. 1. 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值. 2. 同步和异步是针对应用程序和内核的交互而言的,同步指的是用

[Z] linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO

原文链接:http://blog.csdn.net/colzer/article/details/8169075 IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file descriptor(fd,文件描述符).而对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符).描述符就是一个数字,指向内核中一个结构体(文件路径,数据

linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)

IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file descriptor(fd,文件描述符).而对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符).描述符就是一个数字,指向内核中一个结构体(文件路径,数据区,等一些属性).那么我们的应用程序对文件的读写就通过对描述符的读写完成. linux将内存分为内核区,用户区.l

Python番外之 阻塞非阻塞,同步与异步,i/o模型

1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步:      所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:      异步的概念和同步相对.当c端一个异步过程调用发出后,调

阻塞/非阻塞/同步/异步详解

欢迎转载,转载请注明原文地址:http://blog.csdn.net/majianfei1023/article/details/45314803 零.导论 阻塞是不是同步,非阻塞是不是异步,他们是什么关系?刚接触网络编程的同学经常会问这种问题,而且把他们搞混,在这里我用我自己的理解详细解答一下. 想了半天,决定先讲阻塞和非阻塞,为什么呢,因为他们的时序在前面(至少我是这么理解的). 我们以一句总结开篇,再以另一句总结结束吧. 阻塞IO和非阻塞IO的区别就在于:阻塞/非阻塞, 它们是程序在等待