资讯专栏INFORMATION COLUMN

如何理解异步/同步 与 阻塞/非阻塞

leap_frog / 2082人阅读

摘要:接下来我们就来探讨下异步同步与阻塞非阻塞它们其中的区别。阻塞非阻塞是针对的第一阶段的描述。

Author: bugall
Wechat: bugallF
Email: 769088641@qq.com
Github: https://github.com/bugall

一: 引言

在面试中我们会碰到这种场景:
面试官:能解释下什么是同步,异步么?

程序员:假如我们执行A,B两个IO操作的时候,如果必须等待A完成后才能执行B那么这个就是

同步的,如果A,B可以同时执行那么就是异步的。

面试官:那能解释下什么是阻塞什么是非阻塞么?

程序员:如果必须等待A完成后才能执行B那么这个就是阻塞的,如果A,B可以同时执行那么就 是非阻塞的

面试官:那你的意思异步/同步的概念与阻塞非阻塞一样了?

程序员:嗄。。。可以这么说吧。我觉得可以并发执行的就是异步非阻塞的。one by one执行 的就是同步阻塞的

二:区分

每个人看去看同一个问题都会有不同的理解,原因就是因为每个人的看待问题的深度不一样,就像上面的对白,程
序员的理解只是停留在应用层面,代码里有多个IO操作,每个IO操作都可以不用互相等待的“同时”执行。

接下来我们就来探讨下异步/同步与阻塞/非阻塞它们其中的区别。

阻塞 / 非阻塞描述的是函数, 指访问某个函数时是否会阻塞线程(block),导致线程进入阻塞状态。
同步 / 异步描述的是执行IO操作的主体是谁,同步是由用户态的进程自己去执行IO操作,异步是用户态进程不关心IO细节,由内核态进程去完成IO操作然后通知用户态进程。

好的,现在定义已经描述完了。现在可以区分它们之间的区别了么?(吃瓜群众:这TM的写的是什么?) ,别急,我们下面举栗说明,包教包会。

三:举栗

一般来说IO分为两个阶段,第一阶段是等待数据阶段,第二阶段是内核空间的数据拷贝到用户空间,假设一个线程(或是进程)P准备执行一个IO操作的话它会经历以下过程:

第一阶段:

P发出一个IO请求,这时候会有两种情况:
1:立刻返回: 非阻塞
2:一直等待,P调用sleep/wait休眠或是挂起,让出CPU给别的线程/进程  阻塞

第二阶段:

这时内核的数据终于准备好了,
那么现在用户进程想要读取内核空间的数据有两种方式:
1:  P自己把数据从内核空间拷贝到用户空间       同步
2:P创建一个线程做数据copy的工作        异步

现在应该明白了吧。阻塞/非阻塞是针对IO的第一阶段的描述。异步/同步是针对IO的第二阶段的描述也就是IO的主体。

这里主要比较难理解的就是同步/异步。首先P在发起IO的请求的时候如果P本身还要负责IO请求后的数据copy(内核空间到用户空间)工作。那么我们就可以说是同步的。

如果P在发起IO操作后数据copy的工作由内核线程/进程或是P自己再创建一个线程/进程去完成,那么我们就可以称之为异步

四:排列组合

同步阻塞IO:

同一个线程在操作IO时一直阻塞,直到读取数据成功,然后线程本身负责把数据从核心空间拷贝到用户空间

同步非阻塞:

同一个线程发起IO后,立即获得返回,后面定期轮询数据读取情况,发现数据读取成功,线程本身负责把数据从核心空间拷贝到用户空间

异步非阻塞:

一个线程发起IO后,立即返回,由另外的线程发现数据读取成功,把数据从核心空间拷贝到用户空间。

非阻塞同步IO由于读写方法非阻塞,并且需要用户自己来进行读写,所以每次调用读写方法实际读写的字节数是不确定的,所以需要一个Buffer来保存每次读写的字节状态。更重要的是用户不知道什么时候完成了读写,一般需要用
while循环判断Buffer的状态来跟踪读写。非阻塞异步IO由于是内核线程进行读写,并且在IO完成后会回调用户提供的callback,编程模型就比较简单,用户只需要调用读写,提供回调就可以了,比如 read(filename, callback)select / poll / epoll 从本质上说都是非阻塞同步IO,select会收到IO就绪的状态,然后通知用户去处理

IO,实际的IO操作还需要用户等待内核复制操作。

要理解IO就绪和完成的区别。就绪指的是还需要用户自己去处理,完成指的是内核帮助完成了,用户不用关心IO过

程,只需要提供回调函数。

五:并行/并发与异步 并行

对多处理器而言--多个程序在同一时刻发生,具有并发的含义,但并发不一定并行,也亦是说并发事件之间不一定要同一时刻发生。

并行:在单处理器中多道程序设计系统中,进程被交替执行,表现出一种并发的外部特种;在多处理器系统中,进
程不仅可以交替执行,而且可以重叠执行。在多处理器上的程序才可实现并行处理。计算机操作系统中把并行性和并发性明显区分开,主要是从微观的角度来说的,具体是指进程的并行性(多处理机的情况下,多个进程同时运行)和并发性(单处理机的情况下,多个进程在同一时间间隔运行的)

并发

对单处理器而言--多个程序在同一时间段发生;

并发中又有:互斥和同步:

互斥:进程间相互排斥使用临界资源;比如写操作;

同步:不是排斥关系而是依赖关系,前一个进程的输出是后一个进程的输入

当第一个进程没有结束时第二个进程必须等待,相互协同完成一些事情;

具有同步关系的一组进程并发时发送的消息称为消息或者事件;

同步和异步:

异步:就是线程B在等待A的结果的时候还可以继续干自己的事儿,

之间通过消息和事件来通知对方,提高了程序运行的效率。

简而言之,就是不是站在那儿傻傻死等;异步和多线程并不是一回事,

异步是最终目的,多线程只是实现的一种方法。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/83101.html

相关文章

  • nginx、swoole高并发原理初探

    摘要:一阅前热身为了更加形象的说明同步异步阻塞非阻塞,我们以小明去买奶茶为例。等奶茶做好了,店员喊一声小明,奶茶好了,然后小明去取奶茶。将响应结果发给相应的连接请求处理完成因为基于,所以每个可以处理无数个连接请求。如此,就轻松的处理了高并发。 一、阅前热身 为了更加形象的说明同步异步、阻塞非阻塞,我们以小明去买奶茶为例。 1、同步与异步 ①同步与异步的理解 同步与异步的重点在消息通知的方式上...

    denson 评论0 收藏0
  • nginx、swoole高并发原理初探

    摘要:一阅前热身为了更加形象的说明同步异步阻塞非阻塞,我们以小明去买奶茶为例。等奶茶做好了,店员喊一声小明,奶茶好了,然后小明去取奶茶。将响应结果发给相应的连接请求处理完成因为基于,所以每个可以处理无数个连接请求。如此,就轻松的处理了高并发。 一、阅前热身 为了更加形象的说明同步异步、阻塞非阻塞,我们以小明去买奶茶为例。 1、同步与异步 ①同步与异步的理解 同步与异步的重点在消息通知的方式上...

    617035918 评论0 收藏0
  • JS—异步、回调、高阶函数

    摘要:而是在调用发出后,被调用者通过状态通知来通知调用者,或通过回调函数处理这个调用。请求程序发出请求,从服务器端获取数据,并设置了回调函数。然后,浏览器会设置侦听来自网络的响应,拿到数据后,将该回调函数插入到事件循环。 并发与并行 并发是指两个或多个事件链随时间发展交替执行,以至于从更高的层次来看,就像是同时运行(但在任意时刻只处理一个事件) 并发的关键是你有处理多个任务的能力,不一定同...

    Dean 评论0 收藏0
  • PHP socket初探 --- 关于IO的一些枯燥理论

    摘要:原文地址要想更好了解编程,有一个不可绕过的环节就是在中,一切皆文件实际上要文件干啥不就是读写么所以,这句话本质就是才是王道用的打开文件关闭文件读读写写,这叫本地文件在编程中,本质就是网络所以,在开始进一步的编程前,我们必须先从概念上认识好 [原文地址:https://blog.ti-node.com/blog...] 要想更好了解socket编程,有一个不可绕过的环节就是IO.在Lin...

    sf190404 评论0 收藏0
  • Javascript的异步和回调

    摘要:异步本质上应该就是多线程语言的产物。如果是多线程的异步,假死的应该是运行方法的线程,而方法仍然会按预期打印出。当然了,按我个人的理解,应该说是是的回调函数。 引子 每个故事都有由来。前两天在看 gulp 的时候,看到了它有个 promise 的玩意儿,然后的然后,这两天就掉进了 javascript 的异步和回调的坑里面去了。 其间搜索了 javascript promise,看到了...

    CarlBenjamin 评论0 收藏0

发表评论

0条评论

leap_frog

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<