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

进程、线程、协程

进程、线程、协程

在并发编程中,进程、线程和协程是三个核心概念,它们在资源管理、调度方式和适用场景等方面各有特点。以下结合两篇博客内容,对三者进行全面梳理。

定义

1. 进程

  • 操作系统进行资源分配和调度的基本单位,可理解为“正在运行的程序实例”。例如打开浏览器时,操作系统会为其创建一个进程,包含运行所需的代码、数据和系统资源。
  • 核心标志是进程控制块(PCB),这是进程存在的唯一标识,PCB通过链表组织,相同状态的进程形成队列。

2. 线程

  • 进程内的执行单元,也被称为“轻量级进程”,是CPU调度和分派的基本单位。
  • 自身仅拥有程序计数器、寄存器和栈等少量必要资源,共享所属进程的全部资源(如内存空间、文件描述符等)。例如浏览器进程中,渲染页面、处理网络请求的线程共享浏览器的资源。

3. 协程

  • 用户态的轻量级线程,调度完全由用户程序控制,不依赖操作系统内核。
  • 依托线程存在,拥有独立的寄存器上下文和栈,切换时只需保存和恢复这些信息,属于“线程内的迷你执行流”。

特点对比

1. 资源与通信

类型资源独立性通信方式通信复杂度
进程拥有独立内存空间、文件描述符等,资源完全隔离依赖IPC机制(管道、消息队列、共享内存等)
线程共享进程资源(堆、全局变量等)通过共享变量直接通信较低(需处理同步问题)
协程共享所属线程及进程的资源同一线程内通过共享变量通信低(无多线程同步问题)

2. 调度与开销

类型调度者切换开销调度方式
进程操作系统内核大(涉及内核态操作,需切换页表、保存完整上下文)抢占式(操作系统强制切换)
线程操作系统内核中(共享进程资源,主要切换局部上下文)抢占式
协程用户程序极小(用户态操作,类似函数切换)非抢占式(需主动让出控制权,如IO操作时)

3. 健壮性与并发能力

  • 健壮性
    • 进程:最高,一个进程崩溃通常不影响其他进程。
    • 线程:较低,一个线程崩溃可能导致整个进程崩溃。
    • 协程:中等,一个协程崩溃一般不影响其他协程,但可能导致所属线程崩溃。
  • 并发能力
    • 进程:低(受限于系统资源,创建数量有限)。
    • 线程:中(数量受内核限制,过多会导致切换开销激增)。
    • 协程:高(一个线程可创建数万个协程,适合高并发场景)。

状态

1. 进程状态

  • 包含运行态(正在CPU上执行)、就绪态(等待CPU调度)、阻塞态(等待资源或事件,如IO完成)三种基本状态,状态间可相互转换。
  • 进程切换(上下文切换):CPU从一个进程切换到另一个时,需保存当前进程的上下文(寄存器、内存页表等)并加载新进程的上下文,开销较大。

2. 线程状态

  • 与进程类似,具备运行态、就绪态、阻塞态,状态转换逻辑基本一致。
  • 线程切换:因共享进程地址空间,无需切换页表,仅需保存和恢复局部上下文,开销远小于进程。

3. 协程状态

  • 无统一的系统定义状态,由用户程序控制,通常通过“主动让出”(如调用yield)和“恢复执行”实现切换,无需内核参与。

适用场景

类型典型适用场景原理说明
进程计算密集型任务(如视频渲染)、隔离性要求高的场景(如多应用同时运行)可充分利用多核CPU,且进程隔离避免相互影响
线程I/O密集型任务(如文件读写)、进程内多任务并发(如多线程下载)共享资源减少通信开销,适合中等并发需求
协程高并发I/O场景(如网络爬虫、微服务RPC调用)极小切换开销,可在IO等待时切换到其他协程,提升CPU利用率

层级关系总结

  • 进程是资源分配的容器,包含一个或多个线程;
  • 线程是进程内的执行单元,承载协程的运行;
  • 协程是线程内的用户态调度单位,依赖线程实现并发。

三者从资源管理和调度层级上呈现:进程 > 线程 > 协程

通过理解三者的差异,可根据任务类型(计算密集型/IO密集型)、并发需求和隔离性要求,选择合适的并发模型,提升程序效率。

http://www.xdnf.cn/news/15419.html

相关文章:

  • AI革命,分布式存储也在革命,全闪化拐点已至
  • MFC扩展库BCGControlBar Pro v36.2新版亮点:可视化设计器升级
  • 深入解析Paimon的RowKind数据变更机制 和 KeyValue存储
  • vue中使用西瓜播放器xgplayer (封装)+xgplayer-hls 播放.m3u8格式视频
  • 【王树森推荐系统】物品冷启05:流量调控
  • Java-72 深入浅出 RPC Dubbo 上手 生产者模块详解
  • 清除 Android 手机 SIM 卡数据的4 种简单方法
  • 网络准入控制系统的作用解析,2025年保障企业入网安全第一道防线
  • OpenVela之开发自测试框架cmocka
  • 【算法训练营Day12】二叉树part2
  • 量产技巧之RK3588 Android12默认移除导航栏状态栏​
  • google浏览器::-webkit-scrollbar-thumb设置容器滚动条滑块不生效
  • Android 性能优化:启动优化全解析
  • C++-linux 7.文件IO(一)系统调用
  • Linux上基于C/C++头文件查找对应的依赖开发库
  • uni-app 选择国家区号
  • CentOS 7服务器上使用Docker部署Notesnook的详细指导说明
  • Spring Cloud分布式配置中心:架构设计与技术实践
  • 链表算法之【获取链表开始入环的节点】
  • 图生生AI模仿裂变:1分钟批量裂变素材图片!
  • MySQL数据库的基础操作
  • C++后端面试八股文
  • 深入解析Hadoop YARN架构设计:从原理到实践
  • 5、qt系统相关
  • LLM表征工程还有哪些值得做的地方
  • linux打包固件shell脚本
  • FOC算法中SIMULINK一些常用模块(1)(个人留存)
  • 多客户端-服务器(select,poll)
  • 第二章 基于新版Onenet搭建云服务(stm32物联网)
  • elementPlus中的el-table实现合并单元格