当前位置: 首页 > 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.xdnf.cn/news/1412713.html

相关文章:

  • VisionProC#联合编程火花塞距离检测与VisionPro操作
  • Augment 宣布 Auggie CLI正式向所有用户开放
  • 旦旦的农场打卡计划
  • 刷题日记0831
  • Animal fats vs. seed oils
  • 云渲染如何重新定义视觉艺术的边界
  • DOS 程序
  • DBeaver:一款免费开源的数据库管理工具
  • BLE广播与扫描
  • 前端学习——CSS
  • 随时随地开发:通过 FRP 搭建从 Ubuntu 到 Windows 的远程 Android 调试环境
  • Hutool DsFactory多数据源切换
  • 企业级架构师综合能力项目案例一(各种组件集群搭建+SpringBoot整合)
  • 决策思维研究体系主要构成
  • Python入门教程之类型判别
  • STM32F103C8T6的智能医疗药品存储柜系统设计与华为云实现
  • 解决git push时的错误提示:“error: src refspec master does not match any”
  • 漏洞基础与文件包含漏洞原理级分析
  • 【重学MySQL】九十四、MySQL请求到响应过程中字符集的变化
  • 盛最多水的容器:双指针法的巧妙运用(leetcode 11)
  • 多智能体系统设计:5种编排模式解决复杂AI任务
  • FPGA设计杂谈之七:异步复位为何是Recovery/Removal分析?
  • FunASR人工智能语音转写服务本地部署测试
  • HTTPS -> HTTP 引起的 307 状态码与HSTS
  • C++动态规划——经典题目(下)
  • Chrome DevTools Performance 是优化前端性能的瑞士军刀
  • JSP 原理深度解析
  • MATLAB R2010b系统环境(四)MATLAB帮助系统
  • 【GPT入门】第62课 情感对话场景模型选型、训练与评测方法,整体架构设计
  • 深度学习篇---MobileNet网络结构