进程
一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程。
线程
进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。
与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。Java 程序天生就是多线程程序。
存在意义
如今各种操作系统均能实现多进程同时执行,也就是支持并发编程。一个进程的创建需要消耗计算机资源,销毁意味着要释放资源。当很多个进程同时执行时,计算机资源的消耗太大,执行效率较低。
如何才能提高并发编程的效率?有两种方式:
进程池:像String常量池、数据库中的连接池,使用进程池来存储多个进程,当进程销毁时并不真的释放这个进程而是将进程存储到进程池中,这样再次使用该进程时直接从进程池中取就好。但进程池维护进程意味着在进程不使用的时候同样需要消耗不少的计算机资源。
使用线程实现并发编程:线程存在于进程当中,一个进程中有很多个线程。线程较进程而言更加轻量,创建、摧毁、调度一个线程要快于进程。之所以快,是因为多个线程是存在于一个进程当中的,共享一份资源,当在一个进程中创建多个线程时,只有第一个线程的创建需要分配资源,之后线程的创建直接共享该资源即可。进程和线程之间的关系就相当于工厂和工厂中的生产线。一个工厂中有多个生产线,生产线的创建、销毁的成本要低于一个工厂。当然一个进程中的线程并不是说越多越好,因为一个进程中的多个线程可能在消耗同一份资源,如果线程之间过多会出现忙等,反而不会提升并发编程的效率,一个进程中的线程的个数与硬件设备的等级有关。
从用户角度看
进程是正在运行的程序实例
线程是进程中执行执行任务的基本单位
也就是说一个运行的程序至少包含一个进程,一个进程至少包含一个线程,线程不能独立于进程存在。
联系:
进程包含线程,一个进程中可以有一个或者多个线程。
进程和线程都是为了解决并发编程。但线程的效率要高于进程,因为多个线程可以共享一份资源,而进程和进程之间是独立的,进程的创建和销毁是一定需要消耗资源的。
区别:
进程是操作系统分配资源的最小单位,线程是操作系统调度的最小单位。
进程具有独立性,进程A的崩溃不会影响到进程B的崩溃;在一个进程中的多个线程是共享一份资源的,一个线程的崩溃可能会影响到该进程中其他线程的崩溃,进而导致整个进程崩溃。
进程间的通信需要在内核中进行,而线程因为共享一份资源可以直接进行通信。
1. 从属关系不同
进程是正在运行程序的实例,进程中包含了线程,而线程中不能包含进程
2. 描述侧重点不同
进程是操作系统分配资源的单位,而线程是操作系统调度的基本单位
3. 共享资源不同
多个进程之间不能共享资源,每个进程有自己的堆、栈、虚存空间(页表)、文件描述符等信息
而线程之间可以共享进程资源文件(堆和方法区)
4.上下文切换速度不同
线程上下文切换速度更快,线程上下文是指从一个线程切换到另一个线程
而进程的上下文切换速度较慢
每个进程都有独立的数据空间(程序上下文),进程之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程的切换的消耗随略小于进程,较少进行内存和磁盘的交换,但是仍然会有堆栈的映射和切换。