-
终极案例
同步阻塞: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操作完成就返回的调用方式。 对异步的两种处理方式:
- 回调函数
- yield
- promise
- async/await(目前最完备的同步化解决方案)
阻塞是指调用线程或者进程被操作系统挂起。
非阻塞是指调用线程或者进程不会被操作系统挂起。
-
并行与并发
并发,针对单处理器,多个程序都在同一个CPU上运行,实际任意时刻点只有一个程序在占用CPU。
并行,针对多处理器,多个程序运行在多个CPU上,实际任意时刻点一个程序占用一个CPU。
-
I/O操作
I/O操作涉及:
- 两个主体:用户进程(线程)、系统内核;
- 两个阶段:等待数据准备、执行数据从内核拷贝到用户进程
同步,是用户进程从内核中将数据取走,分为:
- 阻塞,用户进程让出CPU时间片,一直等待内核把数据准备好
- 非阻塞,用户进程不断地主动去看数据是否准备好,期间占有CPU时间片执行其他指令
异步,用户进程发起IO请求,注册回调接口,之后执行其他指令,由内核负责调用回调接口把数据拷贝到用户进程。
-
备注
本文是搜集到的网络上关于同步、异步、阻塞、非阻塞、并发、并行比较好的阐述,具体的我也还没完全搞懂,后续回来修改。
-
Reference
编程中的异步、同步、阻塞、非阻塞、并行、并发、回调概念
猜你喜欢
转载自blog.csdn.net/The_Time_Runner/article/details/105476935
今日推荐
周排行