程序、线程和进程:
- 程序是由数据和指令组成,但是这些指令是需要运行的,数据是需要读写的,那么数据就需要加载到内存中,指令需要加载到CPU上。在指令的运行过程中可能还需要使用到磁盘、网络等设置,进程是用来加载指令、管理内存和IO的。
- 当这个程序需要被运行,从磁盘中加载这个程序的代码到内存中,这就相当于开启了一个进程。
- 进程可以视为程序的一个实例,有的程序可以同时运行多个进程(浏览器),有的程序只能运行一个进程(QQ音乐)。
- 一个进程之内可以有一到多个线程。
- 一个线程就是一个指令流,指令流中的指令以一定的顺序交给CPU执行。
- 线程是最小调度的单位,进程是资源分配的最小单位。
并行和并发:
- 如果一个CPU是单核CPU,但是同时要运行多个线程的指令,那么它所做的就是将CPU的时间片分给不同的线程使用,每个线程执行一个时间片的内容后,就换下一个线程执行,其实本质上是串行执行的,这就是并发。
- 如果一个CPU是多核CPU,每个核心负责一个线程的执行,那么多个线程之间其实是并行的,那么就是并行。
从方法调用的角度来说,同步和异步:
- 需要等待结果返回,才能继续运行是同步。
- 不需要等待结果返回,就能继续运行是异步。
多线程是可以提升程序运行的效率的,假设我们存在四个操作
计算1花费10ms
计算2花费11ms
计算3花费9ms
汇总花费1ms
在这种情况下,如果单线程执行,也就是串行执行,那么花费的时间为10+11+9+1=31ms。
如果是多核的CPU,至少是四核CPU,那么主线程负责执行主程序,其他的线程分别负责不同的计算,那么最后的结果为11+1=12ms。
在单核CPU场景下,多线程不能实际地提高程序的运行效率,甚至会因为需要进行上下文的切换而导致程序的运行速度会更慢,优点在于可以让多个任务都使用到CPU执行,不会让单个任务一直占用CPU而导致其他任务无法执行。
在多核CPU的场景下,能否提高程序的运行效率还是需要看情况的:
- 如果任务是可以进行拆分的,也就是任务之间是较为独立的,没有出现任务2的执行需要依赖于任务1的结果,这样我们将任务拆分之后,多个核心并行执行多个任务,就可以提升效率。
- 如果任务之间是相互依赖的,那么在多核场景下也没法谈及效率的提升。
IO操作虽然不会占用CPU,但是如果当前线程使用的是阻塞IO,那么是需要等待读取结果的,这段时间的CPU就没有利用到,所以才会有非阻塞IO和异步IO的优化。