进程和线程、并发和并行、同步和异步的区别

一、进程和线程的区别

1. 基本概念

进程(Process):操作系统资源分配的基本单位,是程序在计算机中的一次执行过程。每个进程都有独立的内存空间、代码段、数据段和堆栈,进程之间相互隔离。

线程(Thread):CPU调度的基本单位,是进程内的执行单元。同一进程内的多个线程共享进程的资源,但每个线程有独立的执行栈和程序计数器。

2. 核心区别

维度进程线程
资源分配资源分配的基本单位资源调度的基本单位
内存空间独立地址空间共享进程地址空间
创建开销大,需分配内存和资源小,共享进程资源
通信方式进程间通信(IPC)复杂直接读写共享内存
独立性高,一个进程崩溃不影响其他进程低,线程崩溃可能影响整个进程
切换开销大,涉及页表切换小,仅需保存和恢复寄存器

3. 关系示意图

text
复制代码
┌─────────────────────────────────────────────┐ │ 操作系统 (OS) │ ├─────────────────────────────────────────────┤ │ ┌─────────────┐ ┌─────────────┐ │ │ │ 进程 A │ │ 进程 B │ │ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │ │ │ │ 线程 A1 │ │ │ │ 线程 B1 │ │ │ │ │ ├─────────┤ │ │ ├─────────┤ │ │ │ │ │ 线程 A2 │ │ │ │ 线程 B2 │ │ │ │ │ └─────────┘ │ │ └─────────┘ │ │ │ │ 独立内存空间 │ │ 独立内存空间 │ │ │ └─────────────┘ └─────────────┘ │ └─────────────────────────────────────────────┘

二、并发和并行的区别

1. 基本概念

并发(Concurrency):在同一时间段内处理多个任务,通过时间片轮转或上下文切换实现。单核CPU也能实现并发。

并行(Parallelism):在同一时刻同时执行多个任务,需要多核CPU支持。

2. 核心区别

维度并发并行
执行方式交替执行多个任务同时执行多个任务
硬件要求单核CPU即可需要多核CPU
关注点任务切换效率任务同时执行
比喻一个厨师同时处理多个订单多个厨师同时处理多个订单

3. 示意图对比

并发执行(单核CPU)

text
复制代码
时间轴 ─────────────────────────────────────────► 任务A: ████ ████ ████ ████ 任务B: ████ ████ ████ 任务C: ████ ████ ████ ████

并行执行(多核CPU)

text
复制代码
时间轴 ─────────────────────────────────────────► CPU核心1: ████████████████████ (任务A) CPU核心2: ████████████████████ (任务B) CPU核心3: ████████████████████ (任务C)

4. 实际应用场景

  • 并发:Web服务器处理多个客户端请求
  • 并行:科学计算、图像处理等CPU密集型任务

三、同步和异步的区别

1. 基本概念

同步(Synchronous):调用方必须等待被调用方执行完成才能继续执行,执行顺序是线性的。

异步(Asynchronous):调用方发起调用后立即返回,无需等待被调用方完成,通过回调、事件或Promise获取结果。

2. 核心区别

维度同步异步
执行顺序顺序执行,阻塞等待非阻塞,立即返回
资源利用CPU空闲等待,效率低CPU可处理其他任务,效率高
编程复杂度简单,顺序思维复杂,需处理回调/事件
适用场景简单任务、需要立即结果IO密集型任务、耗时操作

3. 执行流程对比

同步调用

text
复制代码
调用方 ──► 执行任务 ──► 等待完成 ──► 获取结果 ──► 继续执行

异步调用

text
复制代码
调用方 ──► 发起任务 ──► 立即返回 ──► 继续执行其他任务 │ ▼ 后台执行任务 │ ▼ 完成后通知调用方(回调/事件)

4. Java中的同步与异步示例

同步代码

java
复制代码
public void syncMethod() { String result = doSomething(); // 阻塞等待 processResult(result); // 等待完成后才执行 }

异步代码

java
复制代码
public void asyncMethod() { CompletableFuture.supplyAsync(this::doSomething) .thenAccept(this::processResult); // 立即返回,结果通过回调处理 doOtherWork(); // 无需等待,立即执行 }

四、总结对比表

概念对核心区别关键词
进程 vs 线程资源分配 vs 资源调度独立内存 vs 共享内存
并发 vs 并行交替执行 vs 同时执行时间片轮转 vs 多核并行
同步 vs 异步阻塞等待 vs 非阻塞顺序执行 vs 回调通知

一句话理解

  • 进程:程序的一次执行,有独立"房间"
  • 线程:进程内的执行单元,共享"房间"资源
  • 并发:一个人同时处理多件事(快速切换)
  • 并行:多个人同时处理多件事
  • 同步:做完一件再做下一件
  • 异步:先做别的,等结果出来再处理
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
Yummy
下载 APP