进程和线程的关系
⭐ 作者:小胡_不糊涂
🌱 作者主页:小胡_不糊涂的个人主页
📀 收录专栏:JavaEE
💖 持续更文,关注博主少走弯路,谢谢大家支持 💖
进程&线程
- 1. 什么是进程
- PCB
- 2. 什么是线程
- 3. 两者关系
1. 什么是进程
进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程;同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。
简单地说,进程就是操作系统提供的一种 “软件资源” 。我们计算机正在运行中的程序就可以成为“任务”,也叫做“线程”。
现在大多数用到的系统都属于“多任务操作系统”,也就是同一时刻,可以同时运行多个任务。
上图中的每个进程在运行时,都需要给它分配一定的系统资源。
也就可以说,进程是系统分配资源的基本单位。
当然也有 “单任务操作系统”,比如:很久之前手机就是同一时刻只能运行一个任务。
但是进程在进行频繁创建和销毁的时候,开销是很大的 ,因为要不断地申请资源(CPU,硬盘,内存…)和释放。
而申请内存的时候,又是很麻烦的,先要指定一个大小,然后系统内部把各种大小的空闲内存,通过一定的数据结构给组织起来。当实际申请的时候,就需要去这样的空间中进行查找,找到个大小合适的空闲内存分配过来。
而线程的存在就是为了解决该问题!
PCB
PCB–进程控制块抽象(PCB Process Control Block)
计算机内部要管理任何现实事物,都需要将其抽象成⼀组有关联的、互为⼀体的数据。在 Java 语⾔中,我们可以通过类/对象来描述这⼀特征。
PCB也就表示了进程信息的结构体。
PCB的重要属性:
- pid–是进程身份标识,同一个机器、同一时刻,每个进程的pid是唯一的
- 内存指针–指向进程使用的内存存放位置
- 文件描述符–进程使用的硬盘的相关信息
支持进程调度的重要属性: - 状态–就绪状态、运行状态、死亡状态、阻塞状态
- 优先级–每个进程执行的优先顺序
- 记账信息
- 上下文–PCB中的数据结构
“保存上下文” 就是把CPU的关键寄存器中的数据保存到内存中(PCB的上下文属性中)
“恢复上下文” 就是把内存中的关键寄存器中的数据加裁到CPU的对应寄存器中
2. 什么是线程
⼀个线程就是⼀个“执⾏流”。每个线程之间都可以按照顺序执⾏⾃⼰的代码。多个线程之间“同时”执⾏着多份代码。
线程在进程的基础上做了改进,保持独立调度执行,省去了“分配/释放资源”带来的额外开销。
在这里,我们也使用PCB来描述一个线程,在PCB中有一个属性–内存指针。
对多个现成的PCB的内存指针,指向的是同一个内存空间。
但并不是随便几个线程就可以共享资源,我们把能够共享资源的这些线程,放在线程组中。
3. 两者关系
进程与线程是包含关系。每个进程都可以包含一个\多个线程。
在有线程之前,进程是资源分配的基本单位,也是调度执行的基本单位。
现在,进程只需要专注于资源分配就可以了,调度执行由线程来负责。
进程与线程是同时创建的吗?
在创建进程时,资源就已经分配。
因为一个进程中至少要有一个线程,也就可以说是,在创建第一个线程的同时,进程也就出来了。
总结:
- 进程是包含线程的
- 每个进程的内存是相互独立、互不干扰的
- 每个线程是一个独立的执行流可以执行一些代码,并且单独的参与到cpu调度中,每个线程有自己的一份资源(状态、上下文、优先级、记账信息)
- 每个进程有自己的资源,进程中的线程共用这一份资源(内存空间和文件描述符表)
- 同一个进程中的线程之间,可能会相互干扰引起线程安全问题
- 线程并非越多越好,要能够合适。如果线程太多了,调度开销可能非常明显,
- 进程和进程之间不会相互影响。
- 如果同一个进程中的某个线程抛出异常,是可能会影响到其他线程会把整个进程中的所有线程都异常终止
- 进程是资源分配的基本单位,线程是调度执行的基本单位