一文分清进程、线程
目录
前言:
在操作系统、Java 多线程开发面试中,进程与线程 是高频基础考点,很多初学者容易混淆二者概念。
1. 基础概念
1.1 什么是进程?
进程:
是操作系统系统资源分配的最小单位
当操作系统加载完一个完整程序之后,会为它独立分配一个内存、文件句柄、CPU时间片、网络端口等全套系统资源,这个独立运行的程序实例就是进程;
具体实例就是我们用电脑按ctrl+shift+esc弹出来的任务资源管理器;
打开电脑上的 Chrome 浏览器,每打开一个完整浏览器窗口就是一个 Chrome 进程;打开 IDEA、微信、QQ,每个软件都对应独立进程。
Java中执行java Test命令.JVM都会启动一个独立进程,堆,方法区等内存空间都归这个进程独占;
我们看见进程中有PID;
PID:我们能解释为进程中分配的标识,操作系统区分不同的数字编号,这个标识就相当于我们的身份证,我们的身份证是不可能出现和别人身份证相同的情况;
对应到PID中: 同一台机器中不可能出现两个不同进程PID相同的;
进程销毁后该编号会被操作系统回收复用;
PID我们将完了,面试里面面试官也可能对你说你PID说完了,那你说说PCB是什么?
PCB(进程控制块):它是操作系统内核中用于存放进程所有管理信息的数据结构。PCB 是进程存在的唯一标识 —— 操作系统正是通过 PCB 来感知、调度和管理进程的。
什么是进程控制块?
我们可以把 PCB 通俗理解为操作系统内核用 C 语言定义的超大结构体,
这个结构体内部封装了该进程的全部身份、资源、调度信息,操作系统通过维护一个存放所有task_struct的链表,实现对全系统进程的统一管理。
但要注意二者存在本质区别:普通 C 结构体存在于用户程序内存中,我们可以直接读写;而 PCB 存放在操作系统内核空间,应用程序没有直接访问权限,所有对进程信息的修改都必须通过系统调用交由内核完成。
我们可以类比于这样的其中一条双向链表,将进程给连接起来;
PID 就是 PCB 结构体内部的一个整型成员变量,操作系统遍历 PCB 链表,匹配pid字段就能精准找到对应进程;一旦 PCB 结构体被内核销毁,代表这个进程彻底消失。
1.2 什么是线程?
线程:
线程是操作系统CPU调度执行的最小执单位
一个进程至少包含一条主线程,同一进程内可以创建多条子线程,所有线程共享当前进程PCB中分配到的全部系统资源。
操作系统为每一条线程维护 TCB(Thread Control Block),类比 PCB 的 C 结构体思路:
TCB 仅保存线程执行上下文,不存储内存、文件等重型资源,这是线程创建、切换开销远小于进程的核心原因。
Linux 内核中,轻量级线程与进程统一使用task_struct,通过信号共享资源标识区分是否共享地址空间。
当我们执行java Test启动 JVM 进程,默认创建main主线程;
此时我们也能看见是否成功启动线程,我们在JavaJDK包中bin目录中找到
这个可执行文件:打开连接

绿色的是默认的线程,而main方法是我们自己主动创建的一个线程;
每当我们创建一个进程,都会在这里面多显示一行
每一个线程是包含在进程之中的;
1.3 进程与线程的区别
关键区别:
- 资源分配:进程资源独立,线程共享进程资源;
- 容错性:进程崩溃不影响其他进程,线程崩溃可能导致同进程其他线程终止;
- 资源冲突:线程间易发生资源竞争,进程间通常隔离;
- 角色:进程是资源分配的基本单位,线程是调度的基本单位。
每个进程有自己独立的资源,进程和进程之间不能共享;同一个进程的线程之间,共享相同的资源.
举一个简单的例子:
我们有一个进程,我们相当于一个橘子加工厂:
- 老板发展起来之后,兴办了一个新的橘子加工厂,水电等等费用都是两个厂分别开的;
- 突然有一天老板:发现这样利润太低了,水电加上七七八八的东西,每一个月收入都不是很高;
- 然后老板将两个加工厂的设备都搬进到同一家工厂,那么另一家工厂的房租以及其他而外的费用就会减少很多;

- 他们共享一个工厂的资源,减少了房租以及其他费用
进程之间不会相互影响,一个进程挂了,其他进程不会有事;同一个进程线程挂了,可能把其他线程一起带走
还是以橘子加工厂为例子;
- 突然有一天,老板要倒闭了,只能减少工厂来稳住自己,此时两个工厂就相当于进程,一个进程出现问题了,另外一个进程依然能正常工作;
- 老板讲机器全部移动到一个工厂;

- 其中一个设备出现问题,另外一个设备可能出现问题,也可能不出现问题,如果此时老板两个设备一个负责榨汁,一个负责封装,榨汁机出现问题,装的机器就可能会出现没汁可装的问题;
- 突然有一天,老板彻底倒闭了

- 此时连同机器一起倒闭了,就出现了
进程出现问题,会带走对应的线程
这也就是我们后面的线程安全问题
进程之间通常(不绝对)不会有“资源冲突"情况.同一个进程的线程之间,特别容易出现资源访问冲突
进程是操作系统资源分配的基本单位,线程是操作系统调度执行的基本单位
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)