多线程和多进程效率的对比
那么线程和进程究竟是怎么样的效率的关系呢?
答:首先:
1、进程是程序的一次执行。
2、进程是资源分配的基本单位(调度单位)。
3、一个进程可以包括多个线程。
4、在单CPU计算机中,有一个资源是无法被多个程序并行使用的:CPU。
5、操作系统调度器:拆分CPU为一段段时间的运行片,轮流分配给不同的程序。
6、操作系统内存管理模块:管理物理内存、虚拟内存相关的事务。
由于CPU同时刻只能执行一个进程,如果我们不加以控制的话,一个进程可能使用CPU直到运行结束,于是出现了操作系统调度器,而进程也成为了调度单位。
进程的运行不仅仅需要CPU,还需要很多其他资源,如内存啊,显卡啊,GPS啊,磁盘啊等等,统称为程序的执行环境,也就是程序上下文。
在这里就出现了并发的概念,调度器切换CPU给不同进程使用的速度非常快,于是在使用者看来程序是在同时运行,这就是并发,而实际上CPU在同一时刻只在运行一个进程。
CPU进程无法同时刻共享,但是出现一定要共享CPU的需求呢?此时线程的概念就出现了。线程被包含在进程当中,进程的不同线程间共享CPU和程序上下文。(共享进程分配到的资源)
单CPU进行进程调度的时候,需要读取上下文+执行程序+保存上下文,即进程切换。
如果这个CPU是单核的话,那么在进程中的不同线程为了使用CPU核心,则会进行线程切换,但是由于共享了程序执行环境,这个线程切换比进程切换开销少了很多。在这里依然是并发,唯一核心同时刻只能执行一个线程。
如果这个CPU是多核的话,那么进程中的不同线程可以使用不同核心,真正的并行出现了。
线程是CPU调度和分配的基本单位,一定要和 进程是操作系统进行资源分配(包括cpu、内存、磁盘IO等)的最小单位 区别清楚。有句话说CPU只能看到线程,可以这么理解,假设我是CPU,我闭着眼,操作系统调度器将一个进程分配给我之后,我拿到进程睁开眼,我看到的是什么?我看到的是进程中的很多线程,那么我现在能调度和分配的是什么?进程?不行,因为我看不到其他进程,何来调度分配,只能调度我看到的那些线程,如果我是4核的话,把线程ABCD分配到核心1234,其他的线程依然要等待分配,至于等待多久,如何分配,暂不在本文讨论范围。于是线程是CPU调度和分配的基本单位。
结论: 计算io操作密集型的代码多线程效率更高,因为线程创建要比进程创建开销少
但是计算密集型的代码多 那么进程操作更快,因为多进可以应用多核技术
2020-07-05