之前老是遇到并行并发、同步异步、阻塞非阻塞等概念的困扰,特别是在学 Nginx 的时候,异步非阻塞,迷。。。。

并发并行

理解它们之间的区别,知道有单核多核 CPU 就差不多了。

对于 并发 ,在只有一个 CPU 资源时,系统处理多任务的方式是以时间片轮转的方式来执行任务,也即任务轮流获得 CPU 资源进而被执行,同一时刻只有一个任务被执行。

而当拥有多个 CPU 资源时,多任务会被分配给不同的 CPU 单元,也即同一时刻会有多个任务 并行 执行。

同步异步

同步异步的概念是从 消息传递方式 的角度来定义的。

在代码中比较典型的体现如下:

1
2
3
4
5
6
7
8
int ret = calculateSync();

calculateAsync(new Callback(){
@Override
public void onRet(int ret){

}
});

所以在这里,前者就是同步的调用,后者是异步的。

前者在调用之后,直到拿到结果才返回;后者在调用后立即返回,结果通过回调的方式回传。
当然,异步的回传结果的方式不止这一种,除了回调函数,还有通知和状态检查。

阻塞非阻塞

阻塞非阻塞是从 等待结果的过程 的角度来定义的。

对于 阻塞 ,当前线程/进程会被操作系统挂起,当条件满足后会通过中断的方式唤醒;非阻塞 则不会导致当前线程/进程被挂起,但是需要自己的通过不断轮询条件是否被满足,效率比较低。

Reference

https://blog.csdn.net/qq_33290787/article/details/51790605
https://www.zhihu.com/question/19732473
https://github.com/calidion/calidion.github.io/issues/40