本篇文章参考自撒网要见鱼大佬的 仅供本身学习提高。html
https://segmentfault.com/a/11...前端
**- 什么是进程** 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。 广义定义:进程是一个具备必定独立功能的程序关于某个数据集合的一次运行活动。它是操做系统动态执行的基本单元,在传统的操做系统中,进程既是基本的分配单元,也是基本的执行单元。 **- 什么是线程** 线程(英语:thread)是操做系统可以进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运做单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中能够并发多个线程,每条线程并行执行不一样的任务。
在当代面向线程设计的计算机结构中,进程是线程的容器。segmentfault
先看个形象的比喻:浏览器
- 进程是一个工厂,工厂有它的独立资源 - 工厂之间相互独立 - 线程是工厂中的工人,多个工人协做完成任务 - 工厂内有一个或多个工人 - 工人之间共享空间
再完善完善概念:网络
- 工厂的资源 -> 系统分配的内存(独立的一块内存) - 工厂之间的相互独立 -> 进程之间相互独立 - 多个工人协做完成任务 -> 多个线程在进程中协做完成任务 - 工厂内有一个或多个工人 -> 一个进程由一个或多个线程组成 - 工人之间共享空间 -> 同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)
而后再巩固下:多线程
能够打开任务管理器,能够看到有一个后台进程列表。这里就是查看进程的地方,并且能够看到每一个进程的内存资源信息以及cpu占有率。并发
理解了进程与线程了区别后,接下来对浏览器进行必定程度上的认识:(先看下简化理解)异步
图中打开了Chrome浏览器的多个标签页,而后能够在Chrome的任务管理器中看到有多个进程(分别是每个Tab页面有一个独立的进程,以及一个主进程)。函数
注意:在这里浏览器应该也有本身的优化机制,有时候打开多个tab页后,能够在Chrome任务管理器中看到,有些进程被合并了oop
主要包含哪些进程:(为了简化理解,仅列举主要进程)
Browser进程:浏览器的主进程(负责协调、主控),只有一个。做用有
浏览器渲染进程(浏览器内核)(Renderer进程,内部是多线程的):默认每一个Tab页面一个进程,互不影响。主要做用为
强化记忆:在浏览器中打开一个网页至关于新起了一个进程(进程内有本身的多线程)
相比于单进程浏览器,多进程有以下优势:
简单点理解:若是浏览器是单进程,那么某个Tab页崩溃了,就影响了整个浏览器,体验有多差;同理若是是单进程,插件崩溃了也会影响整个浏览器;
对于普通的前端操做来讲,页面的渲染,JS的执行,事件的循环,都在这个进程内进行。浏览器的渲染进程是多线程的。
渲染进程包含哪些主要的线程?
1.GUI渲染线程【图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)】
2.JS引擎线程
3.事件触发线程
4.定时触发器线程
5.异步http请求线程
为何JS引擎是单线程的?为何须要异步? 单线程又是如何实现异步的呢? 查看【连接描述】
若是本身打开任务管理器,而后打开一个浏览器,就能够看到:任务管理器中出现了两个进程(一个是主控进程,一个则是打开Tab页的渲染进程),
而后在这前提下,看下整个的过程:(简化了不少)
Renderer进程的Renderer接口收到消息,简单解释后,交给渲染线程,而后开始渲染
这里绘一张简单的图:(很简化)
GUI渲染线程与JS引擎线程互斥
因为JavaScript是可操纵DOM的,若是在修改这些元素属性同时渲染界面(即JS线程和UI线程同时运行),那么渲染线程先后得到的元素数据就可能不一致了。
所以为了防止渲染出现不可预期的结果,浏览器设置GUI渲染线程与JS引擎为互斥的关系,当JS引擎执行时GUI线程会被挂起,
GUI更新则会被保存在一个队列中等到JS引擎线程空闲时当即被执行。
从上述的互斥关系,能够推导出,JS若是执行时间过长就会阻塞页面。
譬如,假设JS引擎正在进行巨量的计算,此时就算GUI有更新,也会被保存到队列中,等待JS引擎空闲后执行。
而后,因为巨量计算,因此JS引擎极可能好久好久后才能空闲,天然会感受到巨卡无比。
因此,要尽可能避免JS执行时间过长,这样就会形成页面的渲染不连贯,致使页面渲染加载阻塞的感受。