概念
Java 并发编程中涵盖了以下这些概念:
- 进程
- 线程
- 并发
- 并行
进程
进程(Process)是指在计算机中正在运行的一个程序的实例。进程是操作系统进行资源分配和调度的基本单位(资源分配的最小单位),用于执行程序的代码和管理与该程序相关的资源。每个进程都有自己的地址空间、内存、文件句柄等资源。
进程的一些相关概念:
-
程序:程序是静态的,是一组指令和数据的集合;而进程是程序在执行时的一个实例,是一个动态的实体。
程序被运行时,程序的代码从硬盘被加载到内存中,此时就开启了一个进程。
程序可以同时运行多个实例进程,也可以仅运行一个实例线程。
-
地址空间:进程的地址空间包括代码段、数据段、堆和栈。
地址空间使得每个进程都在自己的独立内存空间中运行,不受其他进程的影响(隔离)。
-
资源分配:操作系统负责为每个进程分配分配和管理资源,例如处理器时间、文件和输入/输出设备等。
-
并发执行:在多核CPU中,多个进程可以并发执行(在相同的时间段内运行)。操作系统通过调度算法控制进程的执行顺序。
-
进程状态:一个进程可以处于不同的状态。一般进程有三种状态(进程的三态模型):就绪、运行、阻塞。
-
多线程:一个进程可以包含多个线程,这些线程共享同一地址空间和资源。多线程可以提高程序的并发性和效率。
线程
线程(Thread)是进程中的一个执行流,是操作系统能够进行运算调度的最小单位(最小调度单位)。与进程相比,线程更轻量级,多个线程可以共享同一进程的资源,包括地址空间、文件描述符和其他相关的进程状态信息。线程之间的共享和通信相对于进程来说更加容易。
线程的一些相关概念:
- 轻量级:相对于进程而言,线程是轻量级的。创建、撤销和切换线程的开销相对较小。
- 共享资源:同一进程内的线程共享相同的地址空间和其他资源。这使得线程之间的通信更加方便,但也需要考虑同步和互斥的问题。
- 独立调度:线程在进程内独立调度,每个线程都有自己的执行状态、程序计数器、寄存器集合等信息。
- 并发执行:多个线程可以并发执行,它们在同一进程内共享进程的资源。这提高了程序的并发性和性能。
- 多线程编程:多线程编程是一种并发编程的方式,允许程序中的多个执行流同时执行。多线程可以用于提高程序的响应性、资源利用率和性能。
- 线程同步:由于线程共享相同的资源,需要通过同步机制来避免竞态条件和数据访问冲突。常见的同步机制包括互斥锁、信号量、条件变量等。
进程和线程的对比
-
进程基本上是相互独立的,而线程存在于进程内,是进程的一个子集。
一个进程包含了一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。
一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。
-
在Java中,线程作为运算调度的最小单位,进程作为资源分配的最小单位。
-
进程拥有共享的资源,如内存空间等,供其内部的线程共享。
-
进程间通信较为复杂:
- 同一台计算机的进程通信称为 IPC(Inter-Process Communication)。
- 不同计算机之间的进程通信,需要通过网络,并遵守共同的协议,例如HTTP协议。
-
线程通信相对简单,因为它们共享进程内的内存。多个线程可以访问同一个共享变量。
-
线程更轻量,线程上下文切换成本一般上要比进程上下文切换低。比起多进程,多线程使用了更小的资源开销。
并行与并发
-
并行(Parallel):指两个或多个任务在同一时刻发生。
并行通常是在多核处理器上同时执行多个线程或进程,其中每个核心独立执行一个任务。
-
并发(Concurrent):指两个或多个任务在重叠的时间段内执行,但不一定同时进行。
并发可以通过时间片轮转等方式实现任务间的快速切换。例如通过操作系统中的多任务处理,多个任务之间通过时间片共享CPU资源,看起来好像在同时执行。
-
串行(Serial):指任务按照顺序一个接一个地执行,每个任务必须等待前一个任务完成后才能开始。
在单核CPU下,线程实际是串行执行的。当CPU时间片很小时,CPU在线程间的切换速度快到人类无法察觉时,从宏观上来看就是并行执行。也就是说,微观串行,宏观并行。
多线程串行执行意味着当一个线程在执行时,其它线程会处于阻塞或等待状态。在这种情况下,CPU频繁地切换线程执行,实际上执行的效率会下降,不如单线程执行。
多线程的目标是实现并发执行,充分利用多核处理器或多处理单元的优势。也就是说,单核CPU并不能充分发挥多线程的优势。
它们的关键区别在于:
- 并行:强调多个任务在同一时刻发生,通常需要多个处理单元。
- 并发:强调多个任务在重叠的时间段内执行,不一定需要多个处理单元。
- 串行:强调任务按照顺序一个接一个地执行。
引用 Rob Pike 的一段描述:
并发是同一时间应对(dealing with)多件事情的能力;并行是同一时间动手做(doing)多件事情的能力。
多线程的应用
- 异步调用:多线程可以让方法的执行变为异步的。程序在处理多个任务时,可以创建一些新的线程,将这些任务交给线程去同时处理,而无需等待任务执行完成后再接着执行下一个任务。
- 提高效率:利用多核CPU的优势来提高程序的运行效率。
评论