并行与并发
并发
单核CPU下,线程实际还是串行执行的。操作系统中有一个组件叫做任务调度器,将CPU的时间片(window下时间片最小约为15毫秒)分给不同的程序使用,只是由于CPU在线程间(时间片很短)的切换非常快,人类感觉是同时运行的。
总结一句话:微观串行,宏观并行
一般会将这种线程轮流使用CPU的做法成为并发(concurrent)
- 微观上是串行的,宏观上是并发的
并行
多核CPU下,每个核都可以调度运行线程,这时候的线程可以是并行。
总结
- 并发(concurrent)是同一时间应对(dealing with)多件事情的能力
- 并行(parallel)是同一时间动手做(doing)多件事情的能力
同步与异步
从方法调用的角度来讲,如果
- 需要等待结果返回,才能继续执行的就是同步
- 不需要等待结果返回,就能继续执行的就是异步
多线程的应用
- 应用之异步调用
- 应用之提高效率
结论
- 单核cpu下,多线程不能实际提高程序运行效率,只是为了能够在不同的任务之间切换,不同线程轮流使用cpu,不至于一个线程总占用cpu,别的线程没法干活。
- 多核cup可以并行跑多个线程,但能否提高程序运行效率还是要分情况的
- 有些任务,经过精心设计,将任务拆分,并行执行,当然可以提高程序的运行效率。但不是所有的计算任务都能拆分
- 也不是所有的任务都需要拆分,任务的目的如果不同,谈拆分和效率没啥意义。
- IO操作不占用cpu,只是我们一般拷贝文件使用的是【阻塞IO】,这时相当于线程虽然不用cpu,但需要一直等待IO结束,没能充分利用线程。所以才有后面的【非阻塞IO】和【异步IO】优化。