1.定义
在对线程和进程进行比较之前,我们先看一下它们的定义。
进程:是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位,是资源分配的最小单位。
线程:是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,是程序执行的最小单位.
2.二者之间的关系
(1)一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
(2)没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
(3)相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。
3.二者之间的区别
二者的区别主要体现在一下几个方面:
第一:操作系统资源管理方式不同。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,安全性更好。但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
第二:通信机制不同(独立性)。正因为进程之间互不干扰,相互独立,进程的通信机制相对很复杂,譬如管道,信号,消息队列,共享内存,套接字等通信机制,而属于同一个进程的所有线程共享该进程的所有资源,通信机制很方便。。
第三:包含关系。线程必定也只能属于一个进程,而进程可以拥有多个线程而且至少拥有一个线程;这一点可以参照上文的第二小节。
第四:程序结构不同。举一个简明易懂的列子:当我们使用进程的时候,我们不自主的使用if else嵌套来判断pid,使得程序结构繁琐,但是当我们使用线程的时候,基本上可以甩掉它,当然程序内部执行功能单元需要使用的时候还是要使用,所以线程对程序结构的改善有很大帮助。
第五:执行过程不同。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
4.二者的优缺点
线程执行开销小,速度快,但不利于资源的管理和保护;
进程执行开销大,稳定安全,利于资源的管理和保护。
5.如何选择
进程与线程的选择取决以下几点:
1、需要频繁创建销毁的优先使用线程,因为对进程来说创建和销毁一个进程代价是很大的。
2、线程的切换速度快,所以在需要大量计算,切换频繁时用线程,还有耗时的操作使用线程可提高应用程序的响应
3、因为对CPU系统的效率使用上线程更占优,所以多机分布用进程,多核分布用线程;
4、并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求;
5、需要更稳定安全时,适合选择进程;需要速度时,选择线程。