Linux22 进程与线程以及内核级线程

线程与进程

进程:一个正在运行的程序。是程序的一次执行过程,是操作系统进行资源分配和调度的基本单位。每个进程拥有独立的内存空间(代码段、数据段、堆、栈)、文件描述符、信号处理等资源。

线程 :进程内部的一条执行路径(序列),是进程内的一个执行单元 ,是操作系统进行调度的最小单位。一个进程可以包含多个线程,所有线程共享进程的内存空间和资源(如文件描述符、全局变量),但每个线程有独立的栈和寄存器。

特性 进程(Process) 线程(Thread)
资源占用 独立内存空间(大)、独立文件描述符等 共享进程资源(内存、文件描述符等),仅私有栈和寄存器(小)
创建 / 销毁开销 大(需分配内存、初始化资源) 小(仅需创建栈和寄存器,共享进程资源)
切换开销 大(需切换页表、刷新 TLB 等) 小(仅切换栈和寄存器,共享内存空间)
通信方式 复杂(需跨进程机制,如管道、信号量、共享内存) 简单(直接读写共享内存中的全局变量)
独立性 高(一个进程崩溃不影响其他进程) 低(一个线程崩溃可能导致整个进程崩溃)
并发粒度 粗(进程间并发) 细(进程内线程间并发)
调度单位 操作系统调度的基本单位 操作系统调度的最小单位
  1. 资源与内存
  • 进程 :每个进程有独立的虚拟地址空间,进程间的内存是隔离的(如进程 A 无法直接访问进程 B 的内存)。例如,打开两个终端窗口运行ls命令,会创建两个独立进程,各自占用独立内存。

  • 线程:同一进程的所有线程共享进程的虚拟地址空间(代码段、全局变量、堆等),但每个线程有自己的栈(用于函数调用和局部变量)和寄存器(记录当前执行状态)。例如,浏览器的 "多标签页" 通常由同一进程的多个线程实现,共享浏览器的内存资源。

  1. 开销与效率
  • 进程:创建 / 销毁时需操作系统分配 / 释放内存、文件描述符等资源,开销较大(毫秒级);进程切换时需保存整个进程的状态(内存映射、文件句柄等),切换成本高。

  • 线程:创建 / 销毁仅需分配 / 释放线程栈和寄存器,开销小(微秒级);线程切换只需保存线程私有状态(栈、寄存器),切换成本低,适合高频并发场景。

单进程单线程:单进程单线程指程序仅包含一个进程,且该进程内仅运行一个线程,所有任务串行执行,是最基础的程序架构。
单进程多线程:单进程多线程指程序包含一个进程,且该进程内运行多个线程,线程共享进程的内存资源(代码段、数据段、堆),但拥有独立的线程栈,可并行执行任务。

对比维度 单进程单线程 单进程多线程
CPU 利用 仅用一个核心,多核性能无法发挥 可利用多核,并行处理提升效率
资源共享 无线程间共享问题(仅一个线程) 共享进程资源,需锁保护共享数据
调度成本 无线程切换开销,调度效率高 存在线程切换开销,频繁切换影响性能
并发能力 串行执行,无并发能力 支持并行并发,可处理多任务
故障容忍 单线程崩溃→进程终止 单线程崩溃→进程终止(与单线程一致)
开发复杂度 逻辑简单,无需处理线程同步 需处理线程同步(锁、信号量),避免数据竞争
资源占用 进程资源 + 1 个线程栈,总占用少 进程资源 + 多个线程栈,总占用略高

内核级线程

用户级线程:用户创建管理,开销小,可以很多,并发

内核级线程:内核用创建管理,开销大,分配在两个处理器,并行

组合模式:(多对多线程模型)是对用户级线程和内核级线程的优化整合

  • 以用户级线程应对 "大量线程" 和 "低开销" 需求,解决内核级线程数量有限、开销高的问题;

  • 以内核级线程应对 "多核并行" 和 "阻塞处理" 需求,解决用户级线程无法利用多核、一阻全阻的问题;

  • 通过线程库实现两层线程的动态映射和调度,成为现代多核环境下高并发、高性能程序的主流线程模型。

特性 用户级线程(ULT) 内核级线程(KLT) 组合模式(多对多)
管理主体 用户线程库(用户态) 操作系统内核(内核态) 线程库(用户态)+ 内核(内核态)
映射关系 多对一(多个 ULT 映射 1 个 KLT) 一对一(1 个 KLT 映射 1 个 ULT) 多对多(多个 ULT 映射少量 KLT)
上下文切换开销 低(用户态切换,无需内核干预) 高(内核态切换,需保存内核上下文) 低(ULT 切换在用户态,KLT 切换少)
并行能力 差(多个 ULT 共享 1 个 KLT,无法利用多核) 好(1 个 KLT 对应 1 个 CPU 核心,支持多核并行) 好(KLT 数量匹配 CPU 核心,支持并行)
阻塞处理 差(1 个 ULT 阻塞,整个 KLT 阻塞) 好(1 个 KLT 阻塞,不影响其他 KLT) 好(ULT 阻塞时,线程库切换其他 ULT 到 KLT)
线程数量上限 高(可创建数千个,开销小) 低(创建过多会消耗大量内核资源) 高(基于 ULT 扩展,数量无明显限制)
相关推荐
小熊恋旧26 分钟前
Python 面向对象编程:方法、属性、继承与多态详解
开发语言·python
云边云科技_云网融合27 分钟前
面向汽车零部件制造业场景的解决方案 | 70 秒:一台车下线的时间里,藏着五张网
开发语言·汽车·php
Evand J27 分钟前
【PMSM滤波例程2】PMSM未知负载转矩观测EKF。MATLAB例程(负载增广EKF与实际仿真结果)。附下载链接
开发语言·matlab·电机
AI_Lab0144 分钟前
宝塔用了两年,有没有必要换成轻量方案?
linux·运维·服务器
by209991 小时前
Linux GDB 调试与 CGDB 使用
linux·运维·服务器·经验分享
will_net1 小时前
apollo 站点部署&C#接入
开发语言·c#·apollo
星恒随风1 小时前
Linux网络编程:应用层协议究竟是什么?从网络计算器到TCP Socket抽象基类完整实现
linux·网络·笔记·tcp/ip
晗夜未央1 小时前
任务队列反复失败,先分清重试、阻塞和结果待核对
开发语言·javascript
熊猫钓鱼>_>1 小时前
四种书签,一条时间线:一个读书 App 的记忆颗粒与它的边界案例【鸿蒙心迹】
开发语言·华为·ai编程·harmonyos·鸿蒙·openharmony·鸿蒙pc
努力努力再努力wz2 小时前
【Lua 入门系列】Lua 函数深入理解:函数对象、多返回值、可变参数、闭包、递归与尾调用优化
开发语言·lua