彻底理解浏览器的进程与线程
- 什么是进程和线程,两者的区别及联系
- 浏览器的进程和线程总结
- 浏览器核心进程有哪些
- 浏览器进程与线程相关问题
什么是进程和线程,两者的区别及联系
进程和线程是操作系统中用于管理程序执行的两个基本概念
-
进程的定义及理解
定义:进程是资源分配的基本单位,它是程序执行时的一个实例,即:进程就是内存中正在运行的应用程序。
- 在程序运行时,系统会创建一个进程,并为它分配资源,然后将该进程放入进程就绪队列。进程调度器选中它时,就会为它分配CPU时间,程序开始真正运行。
- 进程拥有独立的地址空间,包括代码空间、数据空间和堆栈空间,每个进程所拥有的数据和变量只属于它自己。进程是作为资源申请和调度单位存在的,具有动态性、并发性、独立性、异步性和结构性等特征。
- 进程的生命周期包括创建、活动、暂停、终止等过程,是动态的产生、变化和消亡的。
-
线程的定义及理解
定义:线程是程序执行的最小单位,也是进程的一个执行流。线程是CPU调度和分派的基本单位,一个进程可以由很多个线程组成。
- 线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下允许多个线程并行。线程的存在意义在于实现并发编程,提高算力利用率,以及在需要等待IO时进行其他工作。
- 线程虽然比进程轻量,创建和销毁的速度更快,调度的速度也更快,但同一个进程的线程之间共享同一个内存空间,一旦一个线程出现异常,可能会导致整个进程异常,容易出现线程安全问题。
-
进程和线程的关系
线程是进程的基本执行单元,一个进程可以包含一个或多个线程,这些线程共同执行进程的任务, 并且所有线程共享进程的资源。
- 资源共享:同一进程内的所有线程共享该进程的资源,包括主存空间、代码和数据空间等。
- 调度单位:线程是CPU调度的基本单位,操作系统根据线程的状态和优先级进行调度,以决定哪个线程可以运行。
- 协作与同步:线程在执行过程中需要协作同步,不同进程的线程间要利用消息通信的办法实现同步,以避免数据冲突和保证程序的正确执行。
浏览器的进程和线程总结
浏览器核心进程有哪些
-
浏览器主进程
负责协调和主控。它的主要职责包括界面显示、用户交互、子进程管理、网络资源管理等。- 主要控制:地址栏、书签、后退、前进,并负责进行浏览器和其它进程之间的调度协调。
- 它具有访问系统资源的权限,Windows中显示为浏览器进程,Android上通常就是App的进程。因为主进程中通常也负责和窗口系统的交互,所以有时也被称为UI进程。
- 早期主进程负责UI交互,持久化数据访问,网络资源下载。最新的Chromium中持久化数据访问,网络资源已作为独立的进程存在。
-
渲染进程(浏览器内核)
任务是将HTML、CSS和JavaScript转换为用户可以与之交互的网页,排版引擎Blink和JavaScript引擎V8都运行在该进程中默认情况下,Chrome为每一个Tab标签页创建一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下的。
渲染进程是多线程的,它有几大类子线程:
- GUI渲染线程
其中包含 HTML解析引擎、CSS解析引擎,负责渲染浏览器界面,解析HTML,CSS,构建DOM树和RenderObject树,布局和绘制等。当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行。注意,GUI渲染线程与JS引擎线程是互斥的,当JS引擎执行时GUI线程会被挂起(相当于被冻结了),GUI更新会被保存在一个队列中等到JS引擎空闲时立即被执行。
- JS引擎线程
也叫 JS 内核,负责解析执行 JS 脚本程序的主线程,例如 V8 引擎。JS引擎一直等待着任务队列中任务的到来,然后加以处理一个Tab页(renderer进程)中无论什么时候都只有一个JS线程,在运行JS程序。同样注意,GUI渲染线程与JS引擎线程是互斥的,所以如果JS执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞。
- 事件触发线程
属于浏览器内核线程(不是JS引擎,可以理解,JS引擎自己都忙不过来,需要浏览器另开线程协助),主要用于控制事件,例如鼠标、键盘等,当事件被触发时,就会把事件的处理函数推进事件队列,等待 JS 引擎线程执行。 - 定时器触发线程
主要控制 setInterval和 setTimeout,用来计时,计时完毕后,则把定时器的处理函数推进事件队列中,等待 JS 引擎线程。注意,由于JS的单线程关系,所以这些待处理队列中的事件都得排队等待JS引擎处理(当JS引擎空闲时才会去执行)。注意,W3C在HTML标准中规定,规定要求setTimeout中低于4ms的时间间隔算为4ms
- 异步http请求线程
通过XMLHttpRequest连接后,通过浏览器新开的一个线程,监控readyState状态变更时,如果设置了该状态的回调函数,则将该状态的处理函数推进事件队列中,等待JS引擎线程执行。
- GUI渲染线程
-
GPU进程
GPU图形处理器(全称:graphics processg unit,缩写:GPU),的使用初衷是为了实现3DCSS的效果,只是随后网页、Chrome的ui界面都选择采用GPU来绘制,这使得GPU成为浏览器的普遍需求。最后,Chrome在其多进程架构中也引入了GPU进程。 -
第三方插件进程
主要负责插件的运行,因为插件易崩溃,所以通过插件进程来隔离,以保证插件进程崩溃不会对浏览器和页面造成影响。每种类型的插件对应一个进程,仅当使用该插件时才创建。 -
网络进程
主要负责页面的网络资源加载,之前是作为一个模块运行在浏览器进程里面的,直至最近才独立处理,成为单独一个进程。 -
缓存进程(Storage Service)
负责提供浏览器存储等功能。它是从浏览器主进程中分离出来的服务。 -
音频进程(Audio Service):
负责处理音频、视频。
注意:这些进程共同工作,使得浏览器能够处理各种复杂的任务,如页面渲染、用户交
互、网络资源管理等。多进程的设计不仅提高了浏览器的性能和安全性,还提升了浏览器的稳定性和响应速度。例如,多进程架构可以避免因某个页面的脚本执行占用过多资源而导致的浏览器崩溃,同时也提高了浏览器对不同页面的隔离度,增强了安全性。
浏览器进程与线程相关问题
- 为什么GUI渲染线程与JS引擎线程是互斥的?
由于JavaScript是可操纵DOM的,如果在修改这些元素属性同时渲染界面(即JS线程和UI线程同时运行),那么渲染线程前后获得的元素数据就可能不一致了。
因此为了防止渲染出现不可预期的结果,浏览器设置GUI渲染线程与JS引擎为互斥的关系,当JS引擎执行时GUI线程会被挂起,GUI更新则会被保存在一个队列中等到JS引擎线程空闲时立即被执行。 - css样式写在html文件内和使用link标签引入外部样式有什么区别?
- css样式如果写在html文件中,在html解析过程中,由html解析引擎解析的。
- css通过link标签引入,在执行到link标签时,会由css解析引擎解析css。
- 因为html解析引擎和css解析引擎是并行执行的,所以最好使用link标签引入的方式,提高解析的效率
- 从进程的角度分析浏览器地址栏输入url后,浏览器做了什么?