编程中的异步、同步、阻塞、非阻塞、并行、并发、回调概念

  • 终极案例

    同步阻塞:Zoe盯着水壶烧开水;

    同步非阻塞:Zoe放好水壶客厅看会电视,时不时去看看直到烧开水;

    异步阻塞:Zoe买了带哨水壶,等着烧开水;

    异步非阻塞:Zoe放好水壶,去客厅看电视,直到水壶烧开响起来。

    同步异步,是对水壶而言,同步水壶只能轮询,异步水壶可以自己告知(响哨);

    阻塞非阻塞,是对Zoe而言。

  • 同步

    编程学习都是从同步流程开始的,所谓同步流程就是:顺序分支循环这三大结构。

    我们提到同步、异步是在指代编程方式,但这两个概念并不源自编程,而是来自更底层的电路

    同步、异步,是基于时序的两个概念。

    步,是指步调同步指相同的步调,异步表示不同的步调。

  • 同步举例

    以买票为例,一队人,售票员(CPU)处理第一个顾客的买单,后面的人等待,第一个人处理完后,后面的人可以同时向前走一步,这就是同步。

    同步一般用于流程性比较强的程序,是一种线性执行的方式。

  • 同步逻辑

    IPO处理:Input-Process-Output

    接受输入-->处理-->输出结果

  • 同步(阻塞)I/O

    发起I/O的线程不从正在调用的I/O操作函数返回(即被阻塞),直至I/O操作完成。

  • 异步

    两队人买票,A队伍的操作不影响B队伍,这就是异步。

  • 异步逻辑

    IPN处理:Input-Process-Next

    接受输入-->处理-->启动下一步(如果有)

    这里的Next只有一步,因此适合模块化编程的函数,这就要求异步编程者需要有良好的异步思维。

    异步,只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕,而是继续执行下面的流程;是一种并行处理的方式。

  • 回调
  • 异步等待async wait(简写为:await)

    等待异步处理产生的输出:异步等待。

    可以一边进行异步等待(await)一边做其他事情,因此这个等待并不产生阻塞。

    但是由于生命了这个等待,编译器/解释器会将后面的代码自动放在等待完成之后调用,这就让异步代码写起来跟同步带吗一样。

  • 异步I/O(维基百科

    异步I/O是操作系统对输入输出的一种处理方式:发起I/O请求的线程不等I/O操作完成,就继续执行随后的代码,I/O结果用其他方式通知发起I/O请求的程序。

  • 同步与异步不同的视角

  • 等待

    同步与异步的核心,就是同步多了一个等待环节,需要等待当前环节完成才进入下一环节。

    同步是好男人,专一的跟一个女孩子谈恋爱、结婚,如果不合适就分手后再跟下一个女孩子谈恋爱、结婚。

    异步可就是”聪明人“了,同时跟多个女孩子谈恋爱,谁最先出结果,就跟谁结婚。

  • 书写与执行

    异步代码的书写顺序执行顺序不同。

  • 阻塞

  • 阻塞案例

    打一个电话没人接,一直等到有人接。

  • 非阻塞

  • 非阻塞案例

    打一个电话没人接,挂断隔一会继续打,直到有人接。

  • 线程/进程的5个状态

    在这里插入图片描述

    一个线程/进程经历的5个状态, 创建,就绪,运行,阻塞,终止。各个状态的转换条件如上图,其中有个阻塞状态,就是说当线程中调用某个函数,需要IO请求,或者暂时得不到竞争资源的,操作系统会把该线程阻塞起来,避免浪费CPU资源,等到得到了资源,再变成就绪状态,等待CPU调度运行。

  • 同步异步与阻塞非阻塞

    双方描述的都是依赖。

  • 对象

    阻塞和非阻塞,描述的是一种状态、是函数调用,如果函数调用能够立即返回结果,而不是让线程等待就是非阻塞。

    同步和异步,描述的是行为方式、线程之间的依赖。

    阻塞和非阻塞,是针对用户进程(线程)的状态来说的:

    • 阻塞意味着用户进程(线程)被挂起,即让出CPU时间片;

    • 非阻塞意味着用户进程(线程)不会挂起,仍可以做其它工作;

    同步和异步,可以认为是针对指令执行顺序来说的:

    • 同步意味着发起调用后,没有得到结果之前,就不返回,自然不能执行其它指令;
    • 异步意味着调用发出后,调用方立刻返回,通过回调等措施拿到结果,这样调用方还可以执行其它指令。
  • 角度二

    同步与异步是关于指令执行顺序的;

    阻塞与非阻塞是关于线程与进程的。

    没有IO操作,所有代码都是同步的;有了IO操作,没有多线程多进程,代码还是同步的;有了IO操作,有了多线程多进程,才有了异步的可能,同时也产生了阻塞与非阻塞。

    同步是指代码调用IO操作时,必须等待IO操作完成才返回的调用方式。

    异步是指代码调用IO操作时,不必等IO操作完成就返回的调用方式。 对异步的两种处理方式:

    1. 回调函数
    2. yield
    3. promise
    4. async/await(目前最完备的同步化解决方案)

    阻塞是指调用线程或者进程被操作系统挂起。

    非阻塞是指调用线程或者进程不会被操作系统挂起。

  • 并行与并发

    并发,针对单处理器,多个程序都在同一个CPU上运行,实际任意时刻点只有一个程序在占用CPU。

    并行,针对多处理器,多个程序运行在多个CPU上,实际任意时刻点一个程序占用一个CPU。

  • I/O操作

    I/O操作涉及:

    • 两个主体:用户进程(线程)、系统内核;
    • 两个阶段:等待数据准备、执行数据从内核拷贝到用户进程

    同步,是用户进程从内核中将数据取走,分为:

    1. 阻塞,用户进程让出CPU时间片,一直等待内核把数据准备好
    2. 非阻塞,用户进程不断地主动去看数据是否准备好,期间占有CPU时间片执行其他指令

    异步,用户进程发起IO请求,注册回调接口,之后执行其他指令,由内核负责调用回调接口把数据拷贝到用户进程

  • 备注

    本文是搜集到的网络上关于同步、异步、阻塞、非阻塞、并发、并行比较好的阐述,具体的我也还没完全搞懂,后续回来修改。

  • Reference

  1. 异步编程需要“意识”
  2. 知乎:什么是阻塞,非阻塞,同步,异步?
  3. 怎样理解阻塞非阻塞与同步异步的区别?
  4. 同步/异步,阻塞/非阻塞概念深度解析
  5. 同步,异步,阻塞,非阻塞等关系轻松理解
  6. 深入理解并发 / 并行,阻塞 / 非阻塞,同步 / 异步
  7. 同步和异步、阻塞和非阻塞
发布了871 篇原创文章 · 获赞 1322 · 访问量 97万+

猜你喜欢

转载自blog.csdn.net/The_Time_Runner/article/details/105476935
今日推荐