目录
1. 线程与进程的定义与概念
1.1 进程 (Process)
1.2 线程 (Thread)
1.3 进程与线程的关系
2. 并行 (Parallelism) 与 并发 (Concurrency)
2.1 并行 (Parallelism)
2.2 并发 (Concurrency)
3. 并行与并发的关系
4. 进程、线程与并发、并行的关系
进程、线程、并发、并行之间的对比
进程、线程、并发、并行之间的关系
5. 小结
6. 面试题目
1. 线程与进程的定义与概念
1.1 进程 (Process)
- 定义:进程是操作系统中正在运行的一个程序的实例。每个进程都有自己独立的内存空间、系统资源和执行代码。可以简单地认为,一个正在运行的程序就是一个进程。
-
特征:
- 独立性:进程是系统资源分配的基本单位,每个进程独立运行,互不影响。
- 资源拥有:进程具有自己独立的地址空间、内存、文件句柄和其他资源,操作系统会为每个进程分配这些资源。
- 开销较大:由于每个进程都有独立的内存空间,进程之间的切换需要较多的上下文信息,导致较大的系统开销。
1.2 线程 (Thread)
- 定义:线程是进程中的一个执行单元。一个进程可以包含多个线程,线程之间共享进程的内存空间和资源。线程是程序执行的最小单位,可以独立执行一段代码。
-
特征:
- 共享资源:同一进程中的所有线程共享进程的地址空间和资源(如内存、文件句柄等),这使得线程之间通信更容易、效率更高。
- 独立调度:线程是 CPU 调度的基本单位,可以被独立调度和执行,即多个线程可以在多核 CPU 上并行运行。
- 轻量级:线程相较于进程而言,创建和销毁的开销较小,切换速度更快,因为它们共享进程的资源。
1.3 进程与线程的关系
- 一个进程可以包含多个线程:每个线程共享进程的内存和资源,可以同时执行不同的任务。例如,在一个浏览器进程中,页面渲染、脚本执行和网络请求可以由不同的线程来完成。
- 进程是资源分配的单位,线程是调度的单位:操作系统会为每个进程分配独立的内存和资源,而线程是操作系统调度的最小单位,负责实际的执行任务。
- 多线程提高程序的效率:由于线程共享进程的资源,线程间的通信成本较低,切换速度快。因此,在需要频繁进行并发操作时,使用多线程可以显著提高程序的效率。
2. 并行 (Parallelism) 与 并发 (Concurrency)
并行和并发是计算机科学中的两个重要概念,虽然它们看似相似,但实际上有很大的区别。
2.1 并行 (Parallelism)
- 定义:并行是指同时执行多个任务。它通常依赖于多核或多处理器系统,在多个 CPU 核心上真正地同时运行多个线程或进程。
- 前提:需要硬件支持(多核 CPU、多个处理器)。多个任务可以在不同的 CPU 核心上同时执行。
- 特点:提高程序的执行效率,减少总执行时间。
-
举例:
- 你有两只手,分别拿起一支笔,同时在两张纸上写字。这是并行,因为你在同一时刻做两件事。
- 在多核 CPU 上,多个线程可以在不同的核心上同时执行,这就是并行。
2.2 并发 (Concurrency)
- 定义:并发是指在同一个时间段内处理多个任务。但并不一定是同时执行(可以是交替进行)。通过任务切换,使得多个任务都在进行(看起来好像在同时进行)。
- 前提:不要求多核 CPU,即使在单核 CPU 上也可以通过快速切换任务来实现并发。
- 特点:通过调度和切换,提高资源利用率,让多个任务都能得到执行。
-
举例:
- 你有一支笔,不停地在两张纸之间来回切换,先写一会儿A纸,再写一会儿B纸。虽然你看起来是在“同时”写两张纸,但实际上是快速切换在写。这是并发,因为你在同一个时间段内处理了多个任务。
- 在单核 CPU 上,操作系统可以通过任务调度,让多个线程快速切换执行,从而让用户感觉多个任务都在同时进行。
3. 并行与并发的关系
- 并行是一种并发:并行是并发的一种特殊形式,特指多任务同时在不同的处理器或 CPU 核心上运行。
- 并发并不一定是并行:并发是指在同一时间段内处理多个任务,任务可以是交替进行,而不是同时进行。
-
实际应用:
- 并发编程:即使在单核 CPU 上,也可以通过多线程来实现并发处理,充分利用时间片,提高程序响应能力。
- 并行编程:在多核 CPU 上,通过多线程、多进程技术可以实现真正的同时运行,从而提高程序的处理效率。
4. 进程、线程与并发、并行的关系
- 进程与并发:一个进程可以包含多个线程,通过线程的调度可以实现并发。
- 线程与并行:在多核 CPU 上,多个线程可以真正做到同时执行,从而实现并行。
- 多进程并行:在多核系统上,可以通过多进程实现并行,每个进程在不同的 CPU 核心上独立运行。
- 多线程并发:在单核系统上,可以通过多线程快速切换执行,实现并发操作。
进程、线程、并发、并行之间的对比
特性 | 进程 (Process) | 线程 (Thread) | 并发 (Concurrency) | 并行 (Parallelism) |
---|---|---|---|---|
基本概念 | 独立运行的程序实例,有独立的内存空间和资源。 | 进程中的执行单元,多个线程共享进程的资源。 | 在同一时间段内执行多个任务(交替进行)。 | 在同一时刻同时执行多个任务(需要多核支持)。 |
资源拥有 | 独立拥有自己的资源(内存、文件句柄等)。 | 共享进程的资源(内存、文件句柄等)。 | 不直接涉及资源分配,依赖线程或进程。 | 不直接涉及资源分配,依赖硬件多核支持。 |
执行方式 | 每个进程独立运行,进程之间不能共享内存。 | 同一进程内的多个线程可同时执行(共享资源)。 | 通过快速切换,任务看起来在同时进行(交替执行)。 | 任务在多个处理器/CPU 核心上同时执行。 |
创建和销毁成本 | 较高,涉及操作系统资源分配和回收。 | 较低,共享进程资源,切换开销小。 | 不直接涉及创建,依赖于线程或进程的切换。 | 不直接涉及创建,依赖于多核处理器的能力。 |
通信方式 | 进程间通信(IPC),开销较大。 | 通过共享内存,通信方便且开销小。 | 无直接通信,依赖进程或线程实现。 | 无直接通信,依赖进程或线程实现。 |
崩溃影响 | 一个进程崩溃不会影响其他进程。 | 进程内一个线程崩溃可能影响整个进程。 | 任务间独立,但调度可能受影响。 | 任务间独立,资源故障可能影响部分并行任务。 |
应用场景 | 操作系统、浏览器、数据库服务等。 | 多线程服务器、并发网络编程、并行计算等。 | 多任务处理、IO 密集型任务、多用户交互等。 | 数据处理、科学计算、大规模图像处理等。 |
进程、线程、并发、并行之间的关系
项目 | 关系说明 |
---|---|
进程与线程 | 一个进程可以包含多个线程,线程共享进程的资源。进程是资源分配的单位,线程是执行调度的单位。 |
进程与并发 | 多个进程可以通过操作系统调度在同一时间段内交替执行,实现并发。 |
线程与并发 | 一个进程中的多个线程可以交替执行,实现并发。即使在单核 CPU 上,也可以通过线程切换实现并发。 |
线程与并行 | 在多核 CPU 上,进程中的多个线程可以真正同时执行,实现并行。 |
并发与并行 | 并行是一种特殊的并发,指的是在同一时刻同时执行多个任务。并发不一定是并行。 |
5. 小结
- 进程是资源分配的单位,拥有独立的内存和资源;线程是进程中的执行单元,多个线程共享进程的资源。
- 并发指在同一个时间段内执行多个任务(可以通过交替进行);并行指在同一时刻同时执行多个任务(需要多核 CPU 支持)。
- 多线程和多进程都是实现并发和并行的方式。在 Java 中,通常使用多线程来实现并发,充分利用多核 CPU 的能力来实现并行。
6. 面试题目
1. 进程包含线程
一个进程里面包含一个或者多个线程
2. 同一个进程的线程之间,共同一份系统资源(内存,硬盘,网络宽带),一份内存资源(对象/变量)
3. 进程是系统资源分配的基本单位
线程是系统调度执行的基本单位
4. 线程是实现并发编程的主流方式多线程有好处,但是不是越多越好
好处:充分利用CPU
过多的坏处: 线程数目达到一定程度, 把多个核心都充分利用之后,如果继续增加线程,则无法提高效率, 甚至可能影响效率, 线程调度也有开销.
5. 多个线程之间可能会相互影响,线程安全问题:一个线程抛出异常,其他线程也会被影响
6. 多个进程之间,一般不会相互影响, 一个程序崩溃了, 并不会影响其他进程