当前位置: 首页 > news >正文

进程线程协程?一文解决!

前言

大家好,这里是程序员阿亮!

这一期来给大家讲解一波很多人容易搞错的概念:进程、线程、协程

一、 进程 (Process):资源分配的最小单位

1. 什么是进程?

进程是操作系统中正在运行的一个程序的实例。你可以把它想象成一个“容器”,里面装着程序运行所需的所有资源。

2. 进程拥有的“共有资源”有哪些?

这是一个核心面试题。当一个进程被创建时,操作系统会为其分配一个独立的地址空间,包含以下共有资源:

  • 代码段 (Code Segment):存储程序的可执行二进制代码。

  • 数据段 (Data Segment):存储全局变量和静态变量。

  • 堆 (Heap):动态内存分配区域(如 C++ 中的malloc或 Java 中的new)。

  • 文件描述符表 (File Descriptors):进程打开的文件、套接字(Socket)等句柄。

  • 信号处理器 (Signal Handlers):处理系统信号的配置。

  • 内存映射 (Memory Mapping):映射的共享库或文件。

特点:进程与进程之间是完全隔离的。一个进程崩溃,通常不会直接导致另一个进程崩溃。


二、 线程 (Thread):CPU 调度的最小单位

1. 什么是线程?

线程是进程内部的一个执行流。一个进程可以包含多个线程,它们共享进程的资源,但每个线程有自己独立的执行状态。

2. 线程独有的资源

虽然线程共享进程的大部分资源,但为了独立运行,它必须拥有:

  • 栈 (Stack):存储局部变量和函数调用链。

  • 寄存器/程序计数器 (PC):记录当前线程执行到了哪一行代码。

3. 进程 vs 线程

特性进程 (Process)线程 (Thread)
本质资源分配的基本单位执行/调度的基本单位
开销切换开销大(需要切换页表、缓存等)切换开销小(共享地址空间)
通信比较复杂(IPC、管道、Socket)非常简单(直接读写共享内存)
健壮性高(相互隔离)低(一个线程死掉可能拖垮整个进程)

三、 协程 (Coroutine):用户态的“轻量级线程”

1. 什么是协程?

协程又被称为“微线程”。它不属于操作系统内核管理,而是完全由**程序员或编程语言运行时(Runtime)**控制的执行单元。

2. 为什么要用协程?

在高并发场景下(如处理 10 万个并发连接),如果开 10 万个线程,操作系统会被频繁的内核态切换累死。

  • 线程切换:需要进入内核态,保存寄存器、堆栈,代价昂贵。

  • 协程切换:在用户态完成,就像在代码里调用一个函数一样快。它通过yield/resume机制,在任务阻塞时主动交出控制权。

代表作:Go 语言的goroutine,Python 的asyncio


四、 总结:三者的进化逻辑

我们可以用一个工厂的比喻来做最终总结:

  1. 进程 = 工厂车间

    • 车间之间是独立的(资源隔离)。

    • 一个车间里有生产线、原材料仓库(共有资源)。

  2. 线程 = 车间里的工人

    • 多个工人共享车间的空间和材料(共享资源)。

    • 工人之间协作很快,但容易为了抢工具打架(线程安全/锁问题)。

  3. 协程 = 工人的“多面手”技能

    • 一个工人(线程)不再死等机器(IO)运转,而是在等待期间去处理另一份工作。

    • 这种切换是工人自己决定的(用户态调度),不需要厂长(操作系统)来传话。


核心对比表

维度进程线程协程
由谁管理操作系统内核操作系统内核程序员/编译器 (用户态)
切换成本极高 (Context Switch)中等极低
资源消耗大 (独立内存空间)中 (独享栈)极小 (几 KB)
并发能力低 (受限于硬件资源)中 (受限于内核调度)极高 (百万级并发)

总结

一句话建议:

如果你需要安全隔离,用进程;如果你需要利用多核 CPU 提速,用多线程;如果你需要处理超高并发的 IO 任务(如 Web 服务器),请拥抱协程

http://www.jsqmd.com/news/816948/

相关文章:

  • 你的数字相册管家:用AntiDupl智能清理重复与缺陷图片
  • TVA 与传统工业视觉:技术内核与应用分野(17)
  • AI辅助开发在扫地机机器人技术中的应用
  • 第75篇:Vibe Coding时代:LangGraph 自动选择回归测试实战,解决每次全量测试太慢、局部测试又漏的问题
  • (B站TinyML 教程学习笔记)C15 - 在 Edge Impulse 中训练模型+C16 - 如何评估模型性能+C17 - 欠拟合与过拟合+C18 - 如何使用模型进行推理
  • 如何高效配置OpenDroneMap:5个实战技巧深度解析无人机数据处理方案
  • 三分钟解锁全平台QQ聊天记录:你的数据,你做主!
  • 从开发者视角看taotokenapi调用的整体响应速度与成功率
  • 3个实用技巧让magnetW磁力搜索工具发挥最大价值
  • 前端Web开发(2)
  • 2026年外墙仿石漆服务商哪家好?主流品牌选型参考与行业实力分析 - 产业观察网
  • Postman便携版:无需安装的Windows API测试工具终极指南
  • Topit:3分钟掌握macOS窗口置顶,工作效率提升200%的终极指南
  • ClawShelf开源媒体库:开发者如何用元数据与标签管理数字资产
  • PRD写得再厚,客户为何不买账?给需求绑上业务的救命绳
  • 2026年成都3-6岁少儿英语启蒙机构对比评测:专业性与教学理念深度对比 - 品牌种草官
  • Python自动化管理Synology NAS:Synology API v0.8全面解析
  • Python Redis客户端实战:redis-py深度解析
  • B站直播推流码终极指南:如何轻松绕过官方限制使用OBS直播
  • 【ROS2速成 - Day2】ROS2五大核心概念吃透(嵌入式类比记忆,超好懂)
  • WhoDB:轻量级现代数据库管理工具的技术架构与核心功能解析
  • 2026年别墅仿石漆供应厂家哪家好:实力维度分析与主流品牌选型参考 - 产业观察网
  • stm32入门常识
  • LXMusic音源终极指南:三步快速解锁全网高品质音乐
  • 2026 南京金轮国际纹眉深度测评:选南京纹绣世家,4 家直营门店技术 / 安全 / 口碑全优 - 小艾信息发布
  • 深入理解C语言指针(三)
  • 【IE大纲】工业工程工程师知识框架
  • 在hermes agent项目中配置custom provider指向taotoken的完整流程
  • 源德广告是做什么的?在普宁做了多少年了?|品牌介绍与服务概览 - 掌上普宁品牌观察
  • CATIA多实体零件自动化拆分:pyCATIA解决复杂几何体管理的技术挑战