阻塞/非阻塞、同步/异步、并发/并行 概念

  • 阻塞/非阻塞 :关键词 循环检查,用于描述 程序在等待调用结果(消息,返回值)时的状态
  • 同步/异步 :关键词 通知,用于描述 程序在调用之后是否为立即响应,然后接收任务完成后的通知
  • 并发/并行 :关键词时间时刻,用于描述 多个程序是否会在同一时刻执行

在处理 IO 的时候,阻塞和非阻塞都是同步 IO。

并发

同一时刻只有一个任务在执行,CPU不断的切换任务,在一个时间段内,看起来是多个任务都在执行

A | ■■■□□□□□□■■■□□□□□□
B | □□□■■■□□□□□□■■■□□□
C | □□□□□□■■■□□□□□□■■■

并行

同一时刻多个任务在同时执行

A | ■■■■■■■■■■■■■■■■■■
B | ■■■■■■■■■■■■■■■■■■
C | ■■■■■■■■■■■■■■■■■■

用一个伪代码解释

以下伪代码并不严格,参考即可

1
2
3
4
5
6
7
8
9
// 并行/并发(该任务是否是同一时刻执行)
Task(){
// 同步/异步 (该方法是否能立即返回结果)
otherMethod(){
// 阻塞/非阻塞(该操作是否会处于阻塞状态)
doSomething;
}
}
});

一个‘老张爱喝茶’故事

同步阻塞

老张把水壶放到火上,站在旁边等水开

同步非阻塞

老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有

老张心想老是去看水有没有开,太麻烦了,于是买了一个会响的水壶。

异步阻塞

老张把响水壶放到火上,站在旁边等

异步非阻塞

老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶

并发

老张要煮两壶水,但是只有一个炉灶,一会烧这壶,一会烧那壶

并行

老张要煮两壶水,嫌一个炉灶太慢了,又买了一个,这次可以两个一起煮了

参考

怎样理解阻塞非阻塞与同步异步的区别?
使用异步 I/O 大大提高应用程序的性能

并发和并行有什么区别?