前面提到的这篇文章主要是针对js和浏览器之间的进程和线程,丰富了一些业务之外的知识~~~我们都知道什么是进程和线程。CPU是计算机的核心,承担着所有的计算任务。按照官网的说法,进程是CPU资源分配的最小单位。字面意思是一个进行中的程序,可以理解为一个可以独立运行,有自己资源空间的任务程序。进程包括正在运行的程序和程序使用的内存和系统资源。CPU可以有很多进程。每次打开软件时,我们的计算机都会生成一个或多个进程。为什么运行的软件太多会卡死?是因为CPU为每个进程分配了资源空间,但是一个CPU总共只有那么多资源,分配的越多越卡,每个进程都是相互独立的,当CPU运行一个进程,其他进程处于非运行状态,CPU使用[1]来使多个进程并发运行。什么是线程线程是CPU调度的最小单位。线程是基于进程的程序运行单元。一般来说,线程是程序中的一个执行流程。一个进程可以有多个线程。一个进程中只有一个执行流程称为单线程,即程序执行时,所走的程序路径是连续排列的,必须先处理好前面的,后面的才会执行。进程中的多个执行流称为多线程,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行线程来完成各自的任务。进程和线程的区别进程是操作系统分配资源的最小单位,线程是程序执行的最小单位。一个进程由一个或多个线程组成,线程可以理解为一个进程中代码的不同执行路径。进程相互独立,但程序的内存空间(包括代码段、数据集、堆等)和一些进程级资源(如打开的文件和信号)在同一线程下是共享的过程。调度和切换:线程上下文切换比进程上下文切换状态要快得多。多进程的好处是显而易见的。比如在网易云上边听音乐边打开编辑器敲代码,编辑器和网易云的进程互不干扰。多线程:多线程是指一个程序中包含多个执行流,即一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行线程完成各自的任务。任务。为什么JS是单线程的JavaScript语言的一大特点就是单线程,也就是说一次只能做一件事。那么,为什么JavaScript不能有多线程呢?这样可以提高效率啊。JS的单线程和它的用法有关。作为一种浏览器脚本语言,JavaScript的主要目的是与用户交互和操作DOM。这就决定了它只能是单线程的,否则会带来非常复杂的同步问题。例如,假设JavaScript同时有两个线程,一个线程向某个DOM节点添加内容,另一个线程删除这个节点,那么浏览器应该以哪个线程为基础呢?有人说js也有Worker线程。是的,为了利用多核CPU的计算能力,HTML5提出了WebWorker标准,允许JavaScript脚本创建多个线程,但子线程完全由主线程控制,不得操作DOM。所以,这个标准并没有改变JavaScript的单线程特性。了解了进程和线程之后,我们来看浏览器分析。浏览器之间存在一些差异,但大致相同。下面我们将以市场份额最大的Chrome为例。浏览器浏览器作为前端是多进程的,必然要和浏览器打交道。浏览器是多进程的。以Chrome为例,我们每打开一个Tab页,都会产生一个进程。我们使用Chrome可以打开很多标签页而不关闭它们,电脑会越来越卡,别的不说,首先就是会消耗大量的CPU。浏览器包含哪些进程?Browser进程是浏览器的主进程(负责协调和主控),只有一个进程。负责显示浏览器界面并与用户进行交互。比如forward,backward等。负责各个页面的管理,创建和销毁其他进程。将渲染(Renderer)进程获得的内存中的Bitmap(位图)绘制到用户界面。网络资源管理、下载等第三方插件进程每种插件对应一个进程,在使用插件时创建进程。GPU进程只有一个,用于3D渲染等。渲染进程(重)通常被称为浏览器内核(Renderer进程,内部是多线程的)。每个Tab页都有一个互不影响的渲染过程。主要功能是页面渲染、脚本执行、事件处理等,为什么浏览器会有多个进程呢?我们假设浏览器是一个单一的进程。如果一个Tab页面崩溃,将影响整个浏览器。体验有多差。同理,如果插件崩溃了,也会影响到整个浏览器。当然,多进程还有很多其他的优点,我会详细说明。浏览器进程很多,每个进程有很多线程,会占用内存。这也意味着内存等资源会消耗很多,有点像用空间换时间。这不仅仅是为了让我们明白为什么Chrome运行久了电脑会死机,哈哈,第一点就到这里了。简单描述一下渲染过程Renderer(重)页面渲染,JS执行,事件循环都是在渲染过程中执行的,所以我们需要重点理解渲染过程。渲染过程是多线程的。让我们看一下渲染过程中一些常用的和主要的线程。渲染过程Renderer的主线程GUI渲染线程负责渲染浏览器界面,解析HTML、CSS,构建DOM树和RenderObject树,布局绘制等。解析html代码(HTML代码的本质是字符串)和将其转化为浏览器可识别的节点生成DOM树,即DOMTree。解析css并生成CSSOM(CSS规则树)。结合DOMTree和CSSOM生成RenderingTree(渲染树)。当我们修改某些元素的颜色或背景颜色时,页面会被重绘(Repaint)。当我们修改元素的大小时,页面会回流(Reflow)。当页面需要Repaing和Reflow时,GUI线程执行并绘制页面。回流(Reflow)的成本高于重绘(Repaint),我们应该尽量避免Reflow和Repaint。GUI渲染线程和JS引擎线程是互斥的。JS引擎执行时GUI线程会被挂起(相当于被冻结)。GUI更新保存在队列中,并在JS引擎空闲时立即执行。JS引擎线程JS引擎线程就是JS内核,负责处理Javascript脚本程序(比如V8引擎)。JS引擎线程负责解析Javascript脚本并运行代码。JS引擎一直在等待任务队列中任务的到来,然后进行处理。浏览器只能有一个JS引擎线程同时运行JS程序,所以js是单线程运行的。任何时候一个Tab页(renderer进程)中只有一个JS线程在运行JS程序。GUI渲染线程和JS引擎线程是互斥的,js引擎线程会阻塞GUI渲染线程。即我们经常遇到的JS执行时间过长,导致页面渲染不连贯,造成页面渲染加载阻塞(即加载慢)。比如浏览器在渲染时遇到
