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

文章目录

进程、线程、程序辨析

什么是程序?

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

什么是进程?

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

一个进程至少包含:

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

程序和进程有什么区别?

  • 程序是静态的,是代码和数据和集合,保存在磁盘
  • 进程是动态的,是程序运行起来的一个实体
  • 一个程序可以有多个进程,但是进程不是程序本身:比如一个记事本程序,我打开了两个,一个没写,一个写了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~

相关推荐
AlfredZhao1 天前
生产环境里,为什么不建议把普通端口直接暴露到公网?
linux·https·443·80
戴为沐2 天前
Linux内存扩容指南
linux
zylyehuo3 天前
Linux 彻底且安全地删除文件
linux
用户805533698033 天前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式
用户034095297913 天前
linux fcitx 5 雾凇拼音 设置在中文输入法下仍然输入英文标点
linux
Web3探索者5 天前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo5 天前
Linux系统中网线与USB网络共享冲突
linux
Sokach10156 天前
Linux Shell 脚本从零到能用:一个新手的一天学习总结
linux
AlfredZhao7 天前
Docker 容器时区不对,`timedatectl` 不存在怎么办?
linux·timezone
zzzzzz3108 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql