目 录CONTENT

文章目录

进程、线程、协程

TalentQ
2025-09-11 / 0 评论 / 0 点赞 / 2 阅读 / 0 字

进程

  • 定义资源分配的最小单位。程序的一次执行实例。它是一个独立的、自包含的实体。

  • 核心特点

    • 拥有独立资源:每个进程都有自己独立的内存地址空间(代码段、数据段、堆栈)、文件描述符、系统资源(如CPU时间、权限等)。

    • 安全性高:一个进程的崩溃通常不会影响其他进程,因为它们的 memory space 是隔离的。

    • 开销大:创建、销毁、切换进程的成本非常高。因为需要分配和回收独立的内存空间、内核数据结构(PCB,进程控制块)等。

  • 通信:进程间通信(IPC)比较复杂,需要用到特定的机制,如:

    • 管道

    • 消息队列

    • 共享内存(虽然共享,但仍需同步机制)

    • 信号量

    • Socket

  • 切换过程“上下文切换”。需要保存和加载整个进程的状态,包括内存页表、寄存器、文件状态等,非常耗时。

线程

  • 定义CPU调度的最小单位。也被称为“轻量级进程”。它是进程内部的一个执行流。

  • 核心特点

    • 共享进程资源:同一个进程内的所有线程共享进程的内存地址空间和系统资源(如打开的文件)。

    • 拥有私有资源:每个线程有自己独立的线程ID、程序计数器、寄存器集合和栈空间(用于存储局部变量和函数调用链)。

    • 开销小:创建、销毁、切换线程的成本远低于进程,因为不需要切换内存地址空间等沉重负担。

    • 风险高:一个线程的非法操作(如访问野指针)可能导致整个进程崩溃,因为它们共享内存。

  • 通信:线程间通信非常简单高效,因为它们共享全局变量和堆内存。但这也带来了同步问题,必须使用锁、互斥量、条件变量等机制来防止数据竞争。

  • 切换过程:同样需要“上下文切换”,但只需保存和加载线程私有的寄存器、栈等状态,比进程切换快得多。

协程

  • 定义用户态的轻量级线程。协程的调度完全由用户程序控制,而不是由操作系统内核管理。

  • 核心特点

    • 用户态管理:创建、调度、切换都在用户态完成,完全绕过了操作系统内核。没有线程切换带来的系统开销(模式切换、CPU缓存失效等)。

    • 极致的轻量:一个协程的栈空间通常是 KB 级别,可以轻松创建数十万甚至上百万个协程。而一个线程的栈通常是 MB 级别。

    • 协作式调度:协程是“协作式”的。一个协程必须主动让出(yield) CPU,才能运行另一个协程。而不是像线程那样被操作系统“抢占”。

      • 优点:没有同步问题(在让出点所有状态都是确定的),减少了锁的使用。

      • 缺点:如果一个协程长时间占用而不让出,会导致其他协程“饿死”。

  • 适用场景高并发I/O密集型应用。例如,一个Web服务器需要处理10万个网络连接。如果用线程,创建10万个线程是不可能的。而用协程,可以轻松创建10万个协程,每个处理一个连接。当某个连接的数据还没到时,协程主动让出,CPU去处理其他已经就绪连接的协程,极大提升了CPU利用率。

如何选择?

  • 需要强隔离、高安全性 -> 多进程(例如Chrome浏览器每个标签页一个进程)

  • 需要共享数据、处理计算密集型任务 -> 多线程(例如图像处理、科学计算,利用多核CPU)

  • 需要超高并发、处理大量I/O操作 -> 多协程 + 少量线程(例如网络服务器、爬虫)

0

评论区