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

进程、线程、协程

进程、线程、协程

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

定义

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.dtcms.com/a/279380.html

相关文章:

  • windows内核研究(进程与线程-进程结构体EPROCESS)
  • Django基础(一)———创建与启动
  • 【反转链表专题】【LeetCode206.反转链表】【LeetCode25.K个一组翻转链表】【LeetCode234.回文链表】
  • Spring Boot 自带的 JavaMail 集成
  • android Perfetto cpu分析教程及案例
  • 5G 到 6G通信技术的革新在哪里?
  • 腾讯云和火山云优劣势对比
  • 电力协议处理框架C++版(三)
  • CA-IS3082W 隔离485 收发器芯片可能存在硬件BUG
  • LTspic下载,帮助及演示电路
  • sfe_py的应力云图计算与显示step by step
  • 暑期自学嵌入式——Day02(C语言阶段)
  • 揭开图像的秘密:OpenCV直方图入门详解
  • 代数基本定理最简短的证明
  • 对于独热编码余弦相似度结果为0和词向量解决了词之间相似性问题的理解
  • ubuntu之坑(十五)——设备树
  • gRPC和http长轮询
  • 新手向:Python自动化办公批量重命名与整理文件系统
  • Dubbo 学习笔记
  • 谷歌收获成果:OpenAI收购Windsurf计划告吹
  • 工业软件加密锁复制:一场技术与安全的博弈
  • Mybatis05-参数和返回
  • 以太网供电(PoE)电源
  • 编程语言设计目的与侧重点全解析(主流语言深度总结)
  • vue中使用西瓜播放器xgplayer (封装)+xgplayer-hls 播放.m3u8格式视频
  • Spark 单机模式安装与测试全攻略​
  • STM32小实验1--点亮LED
  • # 电脑待机后出现死机不能唤醒怎么解决?
  • 【终极指南】ChatGPT/BERT/DeepSeek分词全解析:从理论到中文实战
  • 2025年人工智能与网络安全国际会议(IACAINS 2025)