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

【计算机通识】进程、线程、协程对比讲解--特点、优点、缺点

核心理念:从“公司”到“员工”再到“员工的心态流”

我们可以将一个计算机系统比喻成一个大公司

  • 进程:就像公司里一个独立的部门(例如:市场部、研发部)。

    • 每个部门有自己独立的办公室、预算、办公设备(即独立的内存空间、系统资源)。
    • 部门之间相互隔离,一个部门着火(崩溃)不会直接烧到另一个部门(稳定性高)。
    • 部门之间沟通需要走正式的流程,比如发邮件、开会(进程间通信 IPC,速度较慢)。
  • 线程:就像部门里的员工

    • 一个部门(进程)里可以有多个员工(线程)一起工作。
    • 所有员工共享部门的资源和空间(共享进程的内存和资源)。
    • 员工之间沟通非常方便,转头说句话就行(共享内存,通信极快)。
    • 但如果两个员工同时使用同一台打印机,需要协调,否则会打印混乱(需要线程同步机制,如锁)。一个员工犯错(野指针)可能导致整个部门瘫痪(进程崩溃)。
  • 协程:就像一个员工在处理多项任务时,所采用的“极致专注与切换”的工作流

    • 这个员工正在写报告(任务A),突然需要等一个数据,他不是干等(阻塞),而是立刻切换到去回复邮件(任务B)。
    • 等邮件回复完,或者数据到了,他又立刻切换回写报告。
    • 这一切切换全由员工自己(用户程序)掌控,不需要老板(操作系统)来指挥调度。效率极高,因为他没有“放下笔-找邮件-打开邮件”这种上下文切换的开销。
    • 这个员工(线程)的工位(栈)上,同时放着好几项任务的工作资料,但他每次只专注于一项。

下面我们进行详细的、技术性的对比。

一、进程

进程是资源分配的基本单位。当一个程序被执行时,它就会变成一个进程。

核心特点:

  1. 资源所有权:拥有独立的虚拟地址空间、文件描述符、全局数据、代码段等。一个进程崩溃,一般不会影响其他进程。
  2. 调度/执行:进程是操作系统进行任务调度的实体。进程的上下文切换涉及页表、寄存器、文件状态等信息的保存和恢复,开销很大
  3. 强大的隔离性:得益于独立的内存空间,进程间数据不共享,安全性高。

优点:

  • 稳定性与安全性高:隔离性好,一个进程崩溃不影响他人。
  • 简化编程模型:无需考虑复杂的同步问题(因为不共享内存)。

缺点:

  • 创建、销毁、切换开销大
  • 进程间通信复杂且缓慢(如管道、消息队列、共享内存等)。

二、线程

线程是CPU调度的基本单位,它是进程内的一条执行流,一个“轻量级进程”。

核心特点:

  1. 共享资源:同一进程下的所有线程共享进程的绝大部分资源,如内存空间、打开的文件等。
  2. 独立执行:每个线程有自己独立的栈、寄存器状态和程序计数器。
  3. 协作性:线程们共同完成进程的任务,可以并行执行(在多核CPU上)。
  4. 上下文切换开销小:因为共享地址空间,切换时不需要切换页表等沉重负担,只需切换私有寄存器、栈等。

优点:

  • 并发性高:充分利用多核CPU优势。
  • 创建、销毁、切换开销远小于进程
  • 通信简单高效:通过共享的全局变量、堆内存即可通信。

缺点:

  • 同步与互斥复杂:由于共享内存,极易出现竞态条件、死锁等问题,必须使用锁、信号量等同步机制,编程难度大、易出错。
  • 稳定性风险:一个线程的不当操作(如访问非法内存)可能导致整个进程崩溃。

三、协程

协程是用户态的“轻量级线程”,其调度完全由用户程序控制,而非操作系统内核。

核心特点:

  1. 用户态调度:创建、切换、销毁完全在用户态进行,开销极低,堪比函数调用。一个线程内可以同时运行成千上万个协程。
  2. 协作式调度:协程是“协作”的,一个协程必须主动让出(yield) 执行权,另一个协程才能执行。这与线程被操作系统强制抢占不同。
  3. 栈内存极小:每个协程有自己独立的栈,但栈大小通常很小(如KB级别),并且可以动态增长,内存占用小。

优点:

  • 极高的并发性能:创建和切换成本极低,可以轻松创建百万级别的协程。
  • 无缝的同步编程体验:由于是协作式的,在一个协程中写代码就像写同步阻塞代码一样简单,无需锁等复杂机制(因为不会在临界区被切换走)。
  • 完美适合I/O密集型任务:当某个协程进行I/O操作时,它会主动让出CPU,让其他协程运行,等I/O完成后再恢复。这样,一个线程就能高效地处理海量网络连接。

缺点:

  • 无法利用多核CPU:一个线程内的所有协程只能运行在一个CPU核心上。要利用多核,需要开启多个线程,每个线程再运行多个协程。
  • CPU密集型任务可能阻塞:如果一个协程执行一个长时间的计算而不让出CPU,会阻塞整个线程,导致其他协程饿死。
  • 需要异步库支持:通常需要与异步I/O库(如asyncio, libuv)配合才能发挥最大威力。

详细对比表格

特性进程线程协程
基本单位资源分配CPU调度用户态任务调度
隔离性,内存空间独立,共享内存极弱,共享所有线程资源
创建/销毁/切换成本极低
数据共享复杂(IPC)简单(共享内存)非常简单(同一线程内)
同步机制不需要(天然隔离)需要(锁、信号量等)通常不需要(协作式)
占用资源多(独立内存、文件等)较少(主要是栈和TCB)极少(主要是栈,且很小)
数量级几十~几百个几百~几千个几万~百万个
并发模型抢占式(由OS调度)抢占式(由OS调度)协作式(由用户程序调度)
适用场景需要强隔离、独立稳定的任务CPU密集型任务,需要利用多核I/O密集型、高并发任务(如网络服务)
编程复杂度低(进程间通信复杂)(同步问题复杂)中(需要理解异步编程模型)

现代开发中的应用场景与组合

在实际的现代后端开发中,这三者往往是组合使用的,以发挥各自的优势:

经典架构:M * N 协程模型

  • M:进程或线程的数量,通常与CPU核心数相等。
  • N:每个线程/进程中创建的协程数量,可以非常庞大。

工作流程(以Go语言的Goroutine为例):

  1. 你启动一个Go程序,它默认会为你创建一个进程,并为每个CPU核心创建一个操作系统线程(M)。
  2. 你在代码中启动成千上万个Goroutine(协程,N)。
  3. 当某个Goroutine执行一个网络请求(I/O操作)时,它会主动让出,Go运行时会将它挂起,并将一个准备好的Goroutine调度到同一个线程上继续执行。
  4. 当网络数据返回时,运行时会再找一个空闲的线程来恢复执行那个等待数据的Goroutine。

这样,用进程/线程的稳定性做骨架,用协程的高并发做血肉,既利用了多核计算能力,又实现了极高的I/O并发吞吐量,同时避免了传统多线程编程中复杂的锁问题。

总结

  • 进程资源分配的孤岛,稳定但笨重。
  • 线程共享资源的执行流,高效但需要小心协调。
  • 协程用户态的精巧工作流,极度轻量,专为高并发I/O而生。

理解它们的区别和联系,是构建高性能、高可用软件系统的基石。在选择时,请根据你的任务类型(CPU密集型 vs I/O密集型)、对稳定性的要求以及对开发效率的考量来做出最佳决策。

http://www.dtcms.com/a/532421.html

相关文章:

  • 专业做俄语网站建设上海建设公司注册
  • 南京营销型网站制作建设一个网站需要什么手续
  • POPAI全球启动仪式成功举办|AI×Web3全球算力革命启航
  • PCB笔记
  • C++ 类的学习(六) 虚函数
  • leetcode 2043 简易银行系统
  • 网站插件代码怎么用哪个网站上做自媒体最好
  • 【LeetCode100】--- 97.多数元素【思维导图+复习回顾】
  • Wasserstein 距离简介
  • 南宁网站建设外包vs做的网站如何
  • 【C++】前缀和算法习题
  • GitHub等平台形成的开源文化正在重塑加特
  • 基于单片机的家庭防盗防火智能门窗报警系统设计
  • 响应式网站建设的未来发展网络规划与设计就业前景
  • 【图像处理】图像错切变换
  • Docker环境离线安装-linux服务器
  • 软件设计师知识点总结:结构化开发
  • 持续改变源于团队学习
  • Unity安装newtonsoft
  • Spring Boot3零基础教程,整合 Redis,笔记69
  • 凡科网站官网登录入口wordpress 列表模板
  • 读论文AI prompt
  • 《Ionic 平台:全面解析与深入探讨》
  • 网站做淘宝客有什么要求微网站的优势
  • FFmpeg 基本数据结构 AVStream分析
  • kafka数据同步一致性问题
  • 淘宝网站的建设内容网站建设的平台
  • Linux进程间通信:管道与System V IPC的全解析
  • 技术选型对比:几种主流方案获取淘宝商品实时数据的优劣分析
  • 想象力网站建设深圳市房地产信息系统平台