进程和线程、并发和并行、同步和异步的区别
一、进程和线程的区别
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个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
内容推荐
AI应用开发中的流式输出:从协议原理到工程实战的完整指南
38
第1章 LearnWise AI项目介绍
5
Spring Boot 如何处理跨域请求(CORS):深度调研报告
3
【入职求助贴】萌新刚入职某大厂做后端开发,目前还在试用期。最近遇到一个棘手的问题,想向大家求助一下。入职不久,leader 给我派了一个任务。跟我说是0.5天就可以解决,我刚毕业入职,做了一个星期没有做出来。实现一个收集定时成功任务的案例。听起来好像不复杂,但我自己摸索着做了一整个星期,到现在还没达到预期效果。这一周我基本是“边学边做”的状态,遇到卡点也会每天主动找 leader 沟通进度和疑问。
2
#字节内推# 实习、校招、社招均有岗位
4
