文章目录
进程、线程、程序辨析
什么是程序?
- 广义:解决特定问题的逻辑集合->有先后的执行顺序
- 狭义:一个可执行的二进制文件->静态的,存在磁盘里
什么是进程?
- 程序从磁盘加载到内存执行,会创建一个进程,程序运行结束,进程也结束->进程是动态的
- 内核观点:分配系统资源的实体,进程是一个资源容器
一个进程至少包含:
- 独立的虚拟地址空间
- 页表
- 打开的文件描述符
- 进程状态
- 用户身份信息
- 当前工作目录
- 寄存器上下文
- 信号处理配置
- 一个或多个线程
程序和进程有什么区别?
- 程序是静态的,是代码和数据和集合,保存在磁盘
- 进程是动态的,是程序运行起来的一个实体
- 一个程序可以有多个进程,但是进程不是程序本身:比如一个记事本程序,我打开了两个,一个没写,一个写了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~