当前位置: 首页 > Web前端 > HTML

BrowserProcessesandThreads

时间:2023-03-28 16:57:04 HTML

BrowserProcessesandThreadsPreface要了解浏览器进程和线程,首先需要理解一句话:进程是CPU资源分配的最小单位,线程是CPU调度的最小单位。当应用程序运行时,CPU会分配一块可以独立运行的内存,即进程,它是应用程序的载体。一个进程一般由三部分组成:程序、数据采集和进程控制块。程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集是程序在执行过程中需要的数据和工作区;程序控制块包含进程的描述信息和控制信息,是进程中唯一存在的Symbol;线程是比进程更小的抽象。在早期的操作系统中,并没有线程的概念。进程是能够拥有资源并独立运行的最小单元,也是程序执行的最小单元。它相当于一个进程只有一个线程,一个进程本身就是一个线程。所以线程有时也被称为轻量级进程。后来随着计算机的发展,多个任务之间上下文切换的效率越来越高,抽象出一个更小的概念——线程。一般来说,一个进程会有多个线程。线程的特点是:线程便宜,线程间切换成本小,启动和退出快,对系统资源的影响比较小。进程和线程有一个通俗的比喻:进程好比工厂,线程好比工厂里的员工,工厂之间相互独立,工厂里的员工相互协作完成任务,每个工厂至少有一名员工。工厂内的空间由员工共享。这段话对应的是:factory=process=cpu分配的一块可以独立运行的内存;进程相互独立;进程中至少有一个线程;进程中的所有线程共享相同的空间;进程中的线程相互协作;了解了进程和线程,现在我们来详细了解一下浏览器的进程和线程;浏览器运行时,会创建相关进程:浏览器进程,是浏览器的主进程,负责协调和总控,只有一个进程,浏览器打开时会创建这个进程;功能:(1)负责浏览器页面渲染(放大、缩小、关闭等),与用户交互,如前进、后退;(2)管理各个页面,负责创建和销毁其他进程。(比如标签页的创建和关闭);(3)网络资源管理、下载等第三方插件进程:每类插件只有一个进程,只有在插件运行时才会创建;GPU进程:最多可创建一个用于3D渲染;浏览器渲染进程(Rendererprocess),内部是多线程的,也是每个标签页拥有的进程,相互独立,负责页面渲染,js执行,事件处理等。每打开一个标签页,都会创建一个Renderer进程。一般会将几个空的标签页合并到一个Renderer进程中,以节省资源。渲染器是多线程的。接下来,了解页面中每个线程的作用。线程包括:GraphicalUserInterfaceGUIRenderingThread·负责构建HTML、css、构建Dom树、Renderer树、布局和绘制等。当界面需要重绘(repaint)或回流(reflow)时由于某些操作引起,线程将执行;JS引擎线程JS内核,也称为js引擎(比如Chrome的V8引擎),负责处理和执行js脚本。等待任务队列任务到来,然后进行处理。浏览器渲染进程在任何时候都只有一个js引擎运行js;事件触发线程。当js引擎执行代码块时,比如setTimeout(也可以来自其他线程,比如鼠标点击,ajax异步请求等),相应的任务会被添加到事件线程;;注意:处理队列中的所有任务都会在JS引擎空闲时执行。定时器触发线程·setTimeout和setInterval所在线程;·定时任务不是在js引擎线程中执行的(会阻塞js的执行),而是另开一个线程进行定时。当及时完成,满足事件触发条件,事件触发线程会将事件添加到大爱处理队列的尾部(定时器最小时间间隔为4ms)。异步http请求线程XMLHttpRequest连接后,通过浏览器开启一个线程请求;当检测到状态改变时,如果设置了回调函数,异步线程会产生一个状态改变事件,并将这个事件推到事件队列的末尾。浏览器内核进程中GUI线程和JS引擎线程是什么关系?GUI线程负责将DOM渲染到页面,JS引擎线程涉及到对DOM的一些增删改查。如果两个线程同时运行,GUI线程在渲染DOM的同时,会进行一些增删改查,必然会造成冲突(渲染结果与DOM操作结果不一致)。因此,这两个线程被设计成互斥的。当GUI线程运行时,JS引擎线程处于冻结状态。同样,当JS引擎线程运行时,GUI线程处于冻结状态。注意:JS执行时间长,页面会卡顿,所以尽量避免执行时间长的代码。