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

【Linux】linux进程 vs 线程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

一、从餐厅经营看进程与线程的区别

🏢 多进程模式 - 开连锁店

👥 多线程模式 - 同一家店多个服务员

二、本质区别:资源管理方式

1. 进程:独立的执行环境

2. 线程:共享的执行流

三、核心技术对比

1. 创建和销毁开销

2. 通信机制对比

3. 隔离性和安全性

四、Linux下的实现机制

1. 进程实现(fork机制)

2. 线程实现(轻量级进程)

五、总结对比表


一、从餐厅经营看进程与线程的区别

想象你要开一家餐厅:

🏢 多进程模式 - 开连锁店

  • 每家分店都有独立的厨房、收银台、服务员

  • 优点:一家店倒闭不影响其他店

  • 缺点:成本高,沟通需要通过总部协调

👥 多线程模式 - 同一家店多个服务员

  • 所有服务员共享同一个厨房、收银台

  • 优点:成本低,沟通直接快速

  • 缺点:一个服务员出错可能影响整个餐厅

二、本质区别:资源管理方式

1. 进程:独立的执行环境

进程是资源分配的基本单位,每个进程都有:

  • 🏠 独立的虚拟地址空间

  • 📁 独立的文件描述符表

  • 📊 独立的数据段、堆栈段

  • 🛡️ 独立的信号处理机制

2. 线程:共享的执行流

线程是CPU调度的基本单位,线程间共享:

  • 🏠 进程的地址空间

  • 📁 进程的文件描述符

  • 📊 进程的全局变量

  • ⚡ 进程的信号处理

但每个线程有自己的:

  • 📍 栈空间(存储局部变量)

  • 🧮 寄存器状态(包括程序计数器)

  • 🆔 线程ID和调度属性

三、核心技术对比

1. 创建和销毁开销

操作进程线程
创建时间慢(毫秒级)快(微秒级)
内存开销大(MB级)小(KB级)
上下文切换重量级轻量级

为什么线程更轻量?

  • 进程创建需要复制父进程的所有资源

  • 线程创建只需分配栈空间和寄存器状态

  • 线程切换只需保存少量寄存器状态

2. 通信机制对比

进程间通信(IPC)

  • 📨 管道(Pipe)

  • 📧 消息队列(Message Queue)

  • 💾 共享内存(Shared Memory)

  • 📡 套接字(Socket)

  • 🚦 信号量(Semaphore)

线程间通信

  • 💬 直接读写共享全局变量

  • 🔒 通过互斥锁、条件变量同步

3. 隔离性和安全性

进程的优势

  • 🛡️ 强大的隔离性:一个进程崩溃不会影响其他进程

  • 🔒 安全性好:不同进程有严格的权限控制

  • 📦 资源管理清晰:每个进程资源独立

线程的挑战

  • ⚠️ 弱隔离性:一个线程崩溃会导致整个进程退出

  • 🎯 需要同步机制:避免数据竞争和死锁

  • 🔍 调试困难:并发问题难以重现和定位

四、Linux下的实现机制

1. 进程实现(fork机制)

 

# 查看进程信息
$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Jan01 ?        00:00:01 /sbin/init
user      1234  1233  0 10:00 pts/0    00:00:00 ./myprocess

2. 线程实现(轻量级进程)

 

# 查看线程信息(LWP为线程ID)
$ ps -eLf | grep myprogram
UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
user      5678  5677  5678  0    4 10:00 pts/0    00:00:00 ./myprogram
user      5678  5677  5679  0    4 10:00 pts/0    00:00:00 ./myprogram

NLWP字段表示线程数量,上图显示有4个线程

五、总结对比表

特性进程线程
基本定义资源分配单位CPU调度单位
内存空间独立地址空间共享地址空间
创建开销
通信成本高(需要IPC)低(共享内存)
隔离性强(一个崩溃不影响其他)弱(一个崩溃整个进程退出)
数据共享困难(需要特殊机制)简单(直接访问)
适用场景需要强隔离、安全性的场景需要高效通信、资源共享的场景

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

相关文章:

  • 《WINDOWS 环境下32位汇编语言程序设计》第9章 通用控件(2)
  • Modbus CRC16校验码在线计算器
  • Python训练营打卡Day49-神经网络调参指南
  • 大模型参数量与计算量(FLOPs)估算方法
  • [WUSTCTF2020]B@se1
  • 后向投影合成孔径辐射源定位方法(一)
  • Linux-数据库
  • MVC模式学习
  • 物种多样性与物种丰富度
  • 制造业生产线连贯性动作识别系统开发
  • 使用 Claude Code 与 Remotion 制作自定义动画视频的完整教程
  • 代码分析之符号执行技术
  • 多人协作开发指南二
  • 简化对齐训练:用明文对比数据SFT替代复杂DPO
  • 8针脚的1.8寸IIC接口的TFT彩屏的八个引脚都需要使用吗?
  • 【编号186】中国劳动统计年鉴(1991-2023)
  • LeetCode 2570.合并两个二维数组
  • 超越关键词:RAG系统如何破解用户查询的“模糊密码”
  • BLE广播与扫描
  • 嵌入式C学习笔记之预编译
  • Redis面试重点-2
  • Coze源码分析-工作空间-项目开发-前端源码
  • 在Windows系统Docker中使用wsl2、容器、windows文件路径三种不同挂载方式的区别和性能差异
  • ceph对象存储-存储池-用户认证
  • @Value注解的底层原理(一)
  • Day18 (前端:JavaScript基础阶段)
  • 数据结构 04(线性:双向链表)
  • Ansible 临时命令与常用模块实操指南
  • Cartographer中的gflag与lua文件
  • 国庆福建霞浦游