一、
cpu的每一个核在同一时间下,只能执行一个线程,就是单核同一时间只能执行一个线程
而cpu可以不停的切换,这样就导致用户感觉可以执行多个线程,这是并发,而不是并行
并发和并行
你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。
并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。
进程和线程
进程就是一个运行的程序,其中一个进程有单独的资源和内存空间,而线程是在进程中的执行单元,其中一个进程可以
多线程在操作同一个资源的时候,就会出现问题,所以就出现锁的问题,线程安全,线程不安全都是围绕这个话题来讲的,其中mysql的操作也是围绕这个来的
多线程和非阻塞的区别
IO操作其实可以分成两个步骤,请求IO操作和执行IO操作。
一般的IO调用过程是这样的:发起IO操作的请求,执行IO操作,得到IO操作的结果,将结果返回给IO操作请求。
阻塞和非阻塞:侧重点是在响应方的策略
阻塞:就是处理完用户的请求之后进行响应数据
非阻塞:就是在不管有没有处理完数据,都立刻给用户响应,这里是响应,而不是主动通知,这个响应式发送方不断的轮询的
同步和异步:侧重点是在发送方的策略
同步是在发送方发送请求后一直等待响应方的响应,
异步是在发送方发送请求之后不管有没有响应,就不管理,而是等待响应方主动给发送方通知
同步/异步关注的是消息通知的机制,而阻塞/非阻塞关注的是程序(线程)等待消息通知时的状态。
dubbo就是用了nio+rpc协议的的原理
Nginx高并发的原理:使用了多路复用和多进程(单线程)的原理来实现高并发的
4 小明的故事#
对上面所讲的概念再次进行一个场景梳理,上面已经明确说明,同步/异步关注的是消息通知的机制,而阻塞/非阻塞关注的是程序(线程)等待消息通知时的状态
。以小明下载文件打个比方,从这两个关注点来再次说明这两组概念,希望能够更好的促进大家的理解。
- 同步阻塞:小明一直盯着下载进度条,到 100% 的时候就完成。
同步体现在:等待下载完成通知;
阻塞体现在:等待下载完成通知过程中,不能做其他任务处理;
- 同步非阻塞:小明提交下载任务后就去干别的,每过一段时间就去瞄一眼进度条,看到 100% 就完成。
同步体现在:等待下载完成通知;
非阻塞体现在:等待下载完成通知过程中,去干别的任务了,只是时不时会瞄一眼进度条;【小明必须要在两个任务间切换,关注下载进度】
- 异步阻塞:小明换了个有下载完成通知功能的软件,下载完成就“叮”一声。不过小明仍然一直等待“叮”的声音(看起来很傻,不是吗)。
异步体现在:下载完成“叮”一声通知;
阻塞体现在:等待下载完成“叮”一声通知过程中,不能做其他任务处理;
- 异步非阻塞:仍然是那个会“叮”一声的下载软件,小明提交下载任务后就去干别的,听到“叮”的一声就知道完成了。
异步体现在:下载完成“叮”一声通知;
非阻塞体现在:等待下载完成“叮”一声通知过程中,去干别的任务了,只需要接收“叮”声通知即可;【软件处理下载任务,小明处理其他任务,不需关注进度,只需接收软件“叮”声通知,即可】
也就是说,同步/异步是“下载完成消息”通知的方式(机制),而阻塞/非阻塞则是在等待“下载完成消息”通知过程中的状态(能不能干其他任务)
,在不同的场景下,同步/异步、阻塞/非阻塞的四种组合都有应用。