进程是什么
从用户的角度来看,进程是正在运行的程序实例,详细解释就是,启动一个程序的时候,操作系统会为该程序创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程,我们把这样的一个运行环境叫进程。
线程是什么
线程是进程中真正执行任务的基本单位。也就是说一个运行的程序至少包含一个进程,一个进程至少包含一个线程,线程不能独立于进程而存在。它包含在进程中,是进程中的实际运行单位。特点1:进程中的任意一线程执行出错,都会导致整个进程的崩溃;特点2:线程之间共享进程中的数据。
Tips:还可以这样理解:
进程和线程的区别
进程和线程的区别主要体现在以下几点。
区别1:从属关系不同
从属关系不同:进程是正在运行程序的实例,进程中包含了线程,而线程中不能包含进程。
区别2:描述侧重点不同
描述侧重点不同:进程是操作系统分配资源的基本单位,而线程是操作系统调度的基本单位。
区别3:共享资源不同
共享资源不同:多个进程间不能共享资源,每个进程有自己的堆、栈、虚存空间(页表)、文件描述符等信息,而线程可以共享进程资源文件(堆和方法区)。
区别4:上下文切换速度不同
上下文切换速度不同:线程上下文切换速度很快(上下文切换指的是从一个线程切换到另一个线程),而进程的上下文切换的速度比较慢。
区别5:操纵者不同
操纵者不同:一般情况下进程的操纵者是操作系统,而线程的操纵者是编程人员。
不同浏览器的进程架构差异
现代浏览器的进程设计因厂商和架构目标而异,但核心思想均围绕隔离性和性能优化展开。以下是主流浏览器的对比分析:
1. Chrome:多进程架构的标杆
Chrome采用严格的进程隔离模型,每个标签页、插件、扩展均分配独立进程,主要进程包括:
浏览器主进程:管理UI、标签页和IPC通信
渲染进程:每标签页对应一个进程,负责HTML/CSS/JS解析渲染
GPU进程:统一处理图形渲染任务
插件/扩展进程:隔离运行第三方插件,防止安全漏洞扩散
优势:单页崩溃不影响其他页面,内存占用高但稳定性强
2. Firefox:混合进程模型
Firefox早期为单进程设计,后转向多进程架构(Electrolysis项目),但进程划分较Chrome更灵活:
主进程:处理UI和核心功能。
渲染进程:默认每个标签页一个进程,但可配置为多标签共享进程
内容进程:独立运行网页脚本,避免阻塞UI线程。
特点:平衡资源占用与隔离性,支持动态调整进程数量
3. Safari:轻量级多进程
Safari采用WebKit引擎,进程模型相对简化:
主进程:管理UI和网络请求。
渲染进程:每个标签页独立进程,但插件和扩展运行在主进程中
GPU进程:与渲染进程合并,减少进程间通信开销。
优势:内存占用低,但隔离性弱于Chrome
4. Edge:基于Chromium的优化
Edge(Chromium内核)与Chrome架构类似,但通过以下优化减少资源占用:
进程复用:相同域名标签页可能共享渲染进程
节能模式:后台标签页的渲染进程可能被冻结
5. 单进程浏览器(如早期IE)
传统浏览器(如IE 11)采用单进程模型,所有功能(渲染、插件、JS)运行在同一进程内,导致:
稳定性差:插件或脚本崩溃会连带整个浏览器崩溃
性能瓶颈:CPU密集型任务阻塞UI响应
以谷歌为例理解一下各个进程和线程
1. 进程:资源隔离与稳定性保障
Chrome将浏览器功能拆分为多个独立进程,每个进程拥有独立的内存空间和系统资源,避免单点崩溃影响全局
主要进程包括:
浏览器主进程:唯一存在,管理UI、标签页生命周期及进程间通信(IPC)
【仅一个主进程。管理UI也就是管理整个浏览器的框架,包括地址栏,标签页,收藏夹这些浏览器自带的内容;管理生命周期即根据用户操作创建或者销毁标签页,分配或者释放资源;进程间通信即主进程作为中枢,通过IPC通道协调渲染进程、GPU进程、网络进程等。例如:
用户点击链接时,主进程将URL传递给网络进程发起请求,再将响应数据转发给对应渲染进程
渲染进程完成页面解析后,通过IPC通知主进程更新地址栏和书签状态】
渲染进程:每个标签页(或iframe)对应一个进程,负责解析HTML/CSS、执行JavaScript及页面渲染
GPU进程:处理所有页面的图形渲染任务(如3D绘图)
网络进程:统一管理HTTP请求、缓存和Cookie
插件/扩展进程:隔离运行插件或扩展,防止恶意代码影响主程序
【有哪些进程背一下,可能被问到:忘(网络)记(GPU)主线(渲染)】
2. 线程:进程内的并发执行
每个进程内部通过多线程实现高效任务处理,共享进程资源但需同步机制。
以渲染进程为例,包括以下线程:【感G觉J啥(时间)都(DD定时器)有(异步http请求线程)】
(1)GUI渲染线程
负责渲染浏览器页面,解析HTML、CSS,构建DOM树、构建CSSOM树、构建渲染树和绘制页面;当界面需要重绘或由于某种操作引发回流时,该线程就会执行。
**注意:**GUI渲染线程和JS引擎线程是互斥的,当JS引擎执行时GUI线程会被挂起,GUI更新会被保存在一个队列中等到JS引擎空闲时立即被执行。
(2)JS引擎线程
JS引擎线程也称为JS内核,负责处理Javascript脚本程序,解析Javascript脚本,运行代码;JS引擎线程一直等待着任务队列中任务的到来,然后加以处理,一个Tab页中无论什么时候都只有一个JS引擎线程在运行JS程序;
**注意:**GUI渲染线程与JS引擎线程的互斥关系,所以如果JS执行的时间过长,会造成页面的渲染不连贯,导致页面渲染加载阻塞。
(3)时间触发线程
时间触发线程属于浏览器而不是JS引擎,用来控制事件循环;当JS引擎执行代码块如setTimeOut时(也可是来自浏览器内核的其他线程,如鼠标点击、AJAX异步请求等),会将对应任务添加到事件触发线程中;当对应的事件符合触发条件被触发时,该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理;
注意:由于JS的单线程关系,所以这些待处理队列中的事件都得排队等待JS引擎处理(当JS引擎空闲时才会去执行);
(4)定时器触发进程
定时器触发进程即setInterval与setTimeout所在线程;浏览器定时计数器并不是由JS引擎计数的,因为JS引擎是单线程的,如果处于阻塞线程状态就会影响记计时的准确性;因此使用单独线程来计时并触发定时器,计时完毕后,添加到事件队列中,等待JS引擎空闲后执行,所以定时器中的任务在设定的时间点不一定能够准时执行,定时器只是在指定时间点将任务添加到事件队列中;
注意:W3C在HTML标准中规定,定时器的定时时间不能小于4ms,如果是小于4ms,则默认为4ms。
(5)异步http请求线程
XMLHttpRequest连接后通过浏览器新开一个线程请求;
检测到状态变更时,如果设置有回调函数,异步线程就产生状态变更事件,将回调函数放入事件队列中,等待JS引擎空闲后执行;
以主进程为例,包括以下线程
(1)UI线程(主线程)
职责:管理浏览器界面(地址栏、书签栏、工具栏等)的渲染与用户交互事件(如点击、滚动)。
关键操作:响应窗口缩放、标签页切换等系统级事件,并更新UI状态
(2)网络线程(Network Thread)
职责:处理所有网络请求,包括DNS解析、TCP连接建立、TLS握手等。
特点:独立于UI线程运行,避免网络阻塞导致界面卡顿
(3)存储线程(Storage Thread)
职责:管理本地存储(如IndexedDB、Cookies、LocalStorage)和文件系统访问。
安全隔离:通过沙箱机制限制网页脚本直接操作本地文件
(4)IO线程(IPC线程)
职责:作为进程间通信(IPC)的中枢,协调主进程与其他进程(如渲染进程、GPU进程)的数据交换。
示例:将用户输入的URL传递给渲染进程,或接收渲染进程的崩溃报告
Tips: 查资料的过程中发现以谷歌浏览器为例,先后出现了网络进程和网络线程这两种说法,乍一看觉得不对,既然网络进程已经被独立出来,为什么别的进程(例如主进程)还要分出来一个网络线程呢?
细想后觉得是非常合理的。浏览器主进程中的网络线程负责浏览器自身的网络请求,比如地址栏的补全,书签,收藏夹,等非页面核心资源的请求。【这些任务需要快速响应且数据量小,直接在主进程的线程中处理可避免跨进程通信(IPC)的开销】
而独立的网络进程则负责页面核心资源的加载,DNS解析、TCP连接等重型网络操作
总结下来就是:网络线程与网络进程并存是Chrome对性能和安全权衡的结果,前者优化轻量级任务的响应速度,后者保障重型任务的稳定性和隔离性