进程进程是CPU资源分配的最小单位。多进程:多进程是指是否允许两个或多个进程同时运行在同一个计算机系统中。多进程的好处是显而易见的。比如你可以边听歌边打开编辑器敲代码,编辑器和听歌软件的进程完全不会相互干扰。浏览器是多进程的,浏览器进程主要包括以下几种:浏览器进程:浏览器的主进程(负责协调和总控)第三方插件进程:每类插件对应一个进程,仅在使用插件时创建GPU进程仅在使用插件时创建:最多一个,用于3D绘图浏览器渲染进程(内核):默认每个Tab页一个进程,相互独立,控制页面渲染、脚本执行、事件处理等(有时会优化,比如多个空白标签会合并到一个进程中)浏览网页时,同时打开几个新页面,会打开几个浏览窗口,但是一旦打开十几个窗口,整个电脑就会越来越慢。多进程浏览器的优点避免页面渲染影响整个浏览器避免第三方插件影响整个浏览器如果其中一个窗口崩溃,不会影响整个浏览器,其他界面仍然可以正常运行。线程一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路径;进程之间是相互独立的,但是同一个进程下的各个线程共享程序的内存空间(包括代码段、数据集、堆等)和一些进程级的资源(比如打开的文件和信号).浏览器的渲染进程(浏览器内核)是多线程的,主要有以下几类:GUI线程Javascript引擎线程事件触发线程定时器线程网络请求线程GUI线程负责渲染浏览器界面的HTML元素,当界面需要当重绘(Repaint)或回流(reflow)被某些操作触发时,线程就会执行。当Javascript引擎运行脚本时,GUI渲染线程处于挂起状态,即“冻结”。Javascript引擎线程也可以称为JS内核,主要负责处理Javascript脚本程序,比如V8引擎。Javascript引擎线程当然负责解析Javascript脚本并运行代码。Javascript是单线程的。这源于Javascript这种脚本语言诞生的使命:JavaScript处理页面上的用户交互,操纵DOM树和CSS样式树,为用户呈现动态丰富的交互体验和服务器逻辑交互处理。如果JavaScript以多线程的方式操作UIDOM,可能会出现UI操作冲突;如果Javascript是多线程的,在多线程交互下,UI中的DOM节点可能会成为关键资源,假设有两个线程同时操作一个DOM,一个负责修改,另一个负责删除,那么这个时候就需要浏览器来决定如何生效,哪个线程的执行结果。当然,我们可以通过锁来解决上面的问题。但是为了避免因为锁的引入带来更大的复杂度,Javascript最初选择了单线程执行。GUI渲染线程和JavaScript引擎线程是互斥的!由于JavaScript可以操作DOM,如果在修改这些元素属性的同时渲染界面(即JavaScript线程和UI线程同时运行),渲染线程前后获取的元素数据可能不一致。因此,为了防止不可预测的渲染结果,浏览器将GUI渲染线程和JavaScript引擎设置为互斥。当JavaScript引擎执行时,GUI线程会被挂起,GUI更新会被保存在一个队列中,直到引擎线程空闲。立即执行。JS阻塞页面加载由于GUI渲染线程和JavaScript执行线程是互斥的,当浏览器在执行JavaScript程序时,GUI渲染线程会被保存在一个队列中,直到JS程序执行完毕,再继续执行.因此,如果JS的执行时间过长,就会导致页面渲染不连贯,造成页面渲染加载阻塞的感觉。定时触发线程浏览器定时计数器不被JavaScript引擎统计,因为JavaScript引擎是单线程的,如果处于阻塞线程状态,会影响定时的准确性,所以使用单独的更合理线程计时并触发计时方案。事件触发线程当事件被触发时,线程会将事件添加到待处理队列的末尾,等待JS引擎的处理。这些事件可以是当前执行的代码块如定时任务,也可以是来自浏览器内核的其他线程如鼠标点击、AJAX异步请求等。但是由于JS的单线程关系,这些事件都需要排队供JS引擎处理。异步http请求线程在连接XMLHttpRequest后通过浏览器开启一个新的线程请求。当检测到状态变化时,如果设置了回调函数,则异步线程会产生一个状态变化事件,并将其放入JavaScript引擎的处理队列中进行处理。
