深刻理解进程、线程、程序

文章目录

进程、线程、程序辨析

什么是程序?

  • 广义:解决特定问题的逻辑集合->有先后的执行顺序
  • 狭义:一个可执行的二进制文件->静态的,存在磁盘里

什么是进程?

  • 程序从磁盘加载到内存执行,会创建一个进程,程序运行结束,进程也结束->进程是动态的
  • 内核观点:分配系统资源的实体,进程是一个资源容器

一个进程至少包含:

  • 独立的虚拟地址空间
  • 页表
  • 打开的文件描述符
  • 进程状态
  • 用户身份信息
  • 当前工作目录
  • 寄存器上下文
  • 信号处理配置
  • 一个或多个线程

程序和进程有什么区别?

  • 程序是静态的,是代码和数据和集合,保存在磁盘
  • 进程是动态的,是程序运行起来的一个实体
  • 一个程序可以有多个进程,但是进程不是程序本身:比如一个记事本程序,我打开了两个,一个没写,一个写了5k字,同样都是记事本程序,但运行的是两个不同的进程

什么是线程?

  • 线程是更轻量的进程,是进程内部的一个执行流
  • 线程是CPU的调度实体--->是共享资源之上的独立执行上下文

线程独享什么?共享什么?

线程独享:

  • 栈空间
  • 线程ID
  • 线程上下文数据
  • 寄存器上下文
  • 程序计数器PC

线程共享:

  • 代码段
  • 堆区
  • 静态区
  • 打开的文件描述符
  • 地址空间

进程、线程、程序三者关系

txt 复制代码
程序:静态文件
		|
		|加载到内存执行
		V
进程:资源容器,运行实例,资源分配实体,被执行的内容
		|
		|内部包含
		V
线程:执行流,CPU调度实体,被执行的上下文

多进程和多线程

  • 多进程的本质是多个资源容器相互隔离
  • 多线程的本质是一个资源容器里面,有多个执行流共享资源

多进程的优缺点?

  • 优点:隔离性好 ,一个进程挂了不影响另一个进程;安全边界清晰, 有天然的地址空间隔离
  • 缺点:创建和切换代价大 ,要维护独立的地址空间、页表等资源;通信复杂, 管道、共享内存、socket、消息队列

多线程的优缺点?

  • 优点:创建和切换代价小 ,同进程内线程切换不需要切地址空间;共享数据方便,公用堆和全局对象
  • 缺点:更容易引发同步和竞争问题 ,共享资源过多,就需要把资源合理保护起来;一个线程崩了,会拖垮整个进程
txt 复制代码
进程A : 地址空间A
进程B :地址空间B
进程C : 地址空间C

彼此隔离

进程P
=----------------------------=
共享地址空间/堆/全局对象/fd表  
线程1	线程2		线程3     
=----------------------------=

共享方便

怎么选择多进程和多线程?

  • 业务强调隔离性、稳定性、更安全,选多进程
  • 业务强调共享数据方便、创建和切换成本低,选多线程

总结:多进程在隔离性上占优势,多线程在共享性和轻量化占优势

linux视角下的线程

Linux内核视角看:线程和进程本质都是一个task,所以并没有给线程单独设计一个独立于进程的新实体,统一抽象成task

linux中的线程是怎么来的?

Linux中创建线程依赖底层的clone

  • 如果clone时,大量资源共享
    • 共享地址空间
    • 共享文件描述符表
    • 共享信号处理信息

那这和task就视为线程

  • 如果不共享这些资源,视为进程

还是如上文所说,线程是轻量化的进程,二者没有太大区别

done~

相关推荐
末日汐4 小时前
传输层协议UDP
linux·网络·udp
zzzsde6 小时前
【Linux】库的制作和使用(3)ELF&&动态链接
linux·运维·服务器
CQU_JIAKE6 小时前
4.3【A]
linux·运维·服务器
qing222222226 小时前
Linux中修改mysql数据表
linux·运维·mysql
Alvin千里无风6 小时前
在 Ubuntu 上从源码安装 Nanobot:轻量级 AI 助手完整指南
linux·人工智能·ubuntu
杨云龙UP7 小时前
Oracle 中 NOMOUNT、MOUNT、OPEN 怎么理解? 在不同场景下如何操作?_20260402
linux·运维·数据库·oracle
Amctwd7 小时前
【Linux】OpenCode 安装教程
linux·运维·服务器
wwj888wwj8 小时前
Docker基础(复习)
java·linux·运维·docker
paldier8 小时前
rootfs挂载失败(error -5)的一个可能
linux