基本概念:
进程:是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发;
线程:进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发。
线程是操作系统可识别的最小执行和调度单位。每个线程都独自占用一个虚拟处理器:独自的寄存器组,指令计数器和处理器状态。每个线程完成不同的任务,但是共享同一地址空间(也就是同样的动态内存,映射文件,目标代码等等),打开的文件队列和其他内核资源。
区别:
-
一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程依赖于进程而存在。
-
进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存。(资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。)
-
进程是资源分配的最小单位,线程是CPU调度的最小单位;
-
系统开销: 由于在创建或撤消进程时,系统都要为之分配或回收资源,如内存空间、I/O设备等。因此,操作系统所付出的开销将显著地大于在创建或撤消线程时的开销。类似地,在进行进程切换时,涉及到整个当前进程CPU环境的保存以及新被调度运行的进程的CPU环境的设置。而线程切换只须保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作。
可见,进程切换的开销也远大于线程切换的开销。 -
通信:由于同一进程中的多个线程具有相同的地址空间,致使它们之间的同步和通信的实现,也变得比较容易。
-
进程编程调试简单可靠性高,但是创建销毁开销大;线程则相反,开销小,切换速度快,但是编程调试复杂,难度大。
-
进程间不会相互影响 ;
线程一个线程挂掉将导致整个进程挂掉;