1.并发与并行
解释1:
-
并行(parallellism):指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。
-
并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。
解释2:
- 如果某个系统支持两个或者多个动作同时存在,那么这个系统就是一个并发系统。
- 如果某个系统支持两个或者多个动作同时执行,那么这个系统就是一个并行系统。
并发系统与并行系统这两个定义之间的关键差异在于存在与执行的差异。
在并发程序中可以同时拥有两个或者多个线程。这意味着,如果程序在单核处理器上运行,那么这两个线程将交替地换入或者换出内存。这些线程是同时存在的——每个线程都处于执行过程中的某个状态。
如果程序能够并行执行,那么就一定是运行在多核处理器上。此时,程序中的每个线程都将分配到一个独立的处理器核上,因此可以同时执行。
所以可以理解为,并行是并发的一个子集。也就是说,你可以编写一个拥有多个线程或者进程的并发程序,但如果没有多核处理器来执行这个程序,那么就不能以并行方式来运行代码。因此,凡是在求解单个问题时涉及多个执行流程的编程模式或者执行行为,都属于并发编程的范畴。
总结
两种解释对并行的理解是一致的,而并发与并行是对等关系还是包含关系上存在出入。大家根据语境自行区分吧。
2.同步与异步
同步(synchronous )和异步(asynchronous)关注的是消息通信机制。
解释1
- 同步是在发出一个“调用”时,在没有得到结果之前,该“调用”就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由”调用者“主动等待这个“调用”的结果。
- 异步是调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。
解释2
- 同步是指当程序1调用程序2时,程序1停下不动,直到程序2完成回到程序1来,程序1才继续执行下去。
- 异步是指当程序1调用程序2时,程序1径自继续自己的下一个动作,不受程序2的的影响。
解释3
- 同步是指发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
- 异步是指发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。
总结
三种解释意义大致相同,只是场景略有差异。
3. 阻塞与非阻塞
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。
系统调用场景
- 阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
- 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程,而会立刻返回。
进程通信场景
进程通信可分为阻塞(同步)或非阻塞(异步)。
- 阻塞通信
– 阻塞发送:发送者在发送消息后进入等待,直到接收者成功收到。
– 阻塞接收:接收者在请求接收消息后进入等待,直到成功收到一个消息。 - 非阻塞通信
– 非阻塞发送:发送者在发送消息后,可立即进行其他操作。
– 非阻塞接收:没有消息发送时,接收者在请求消息后,接收不到任何消息(有消息时,就收到消息,没消息时,就收不到消息,不管收没收到消息,继续进行其他操作)。
总结
一般来说,同步与阻塞对应,异步与非阻塞对应。但不同领域(网络IO模型),对同步、异步,阻塞、非阻塞的理解可能会有差别,也有同步非阻塞的情况,但异步阻塞应该不存在。