进程概述
浏览器的多进程,以chrome为例
-
Browser进程
- 控制chrome的用户界面。所谓的用户界面,指的是浏览器网页窗口上面的部分,包括:地址栏、书签、向前向后按钮等
- 负责网络请求、文件访问等不可见的底层服务
- 负责各页面管理,创建和销毁其他进程
-
渲染进程
- 渲染进程负责页面渲染、脚本处理等内容
- 每个tab有一个自己的独立的渲染进程,这么做的好处是:1、如果某个tab崩溃,不会影响其他tab的正常运行;2、隔离每个tab,避免一些跨tab造成的安全问题
-
插件进程
-
GPU进程
- 负责GPU任务(GPU会负责处理来自各个应用的请求,并且在同一个界面上进行绘制)
-
其他
可以在chrome的任务管理器中查看各个进程,其中每一行为一个进程,而且可以看到每个进程 CPU和内存的使用情况
进程合作
以在chrome地址栏输入网址为例,说明浏览器各进程之前的合作的:
- 在chrome地址栏输入网址,Browser进程中的UI线程获取输入内容,然后分辨这个输入是一个地址还是一个查询字符串,chrome的地址栏既可以直接访问网址也可以进行搜索引擎查询。若是一个地址,则说明接下来需要对此网址进行请求;否则表示应该请求对应搜索引擎
-
Browser进程中的UI线程展示网络正在请求的指示器,比如loading图标等;Browser进程的network线程对响应网络进行请求处理,包括DNS查询、建立TCP连接等
- 如果此时network线程收到一个重定向的服务器返回,则告知UI线程进行重定向,展示不同的网址,并对重定向网址进行网络请求
-
network线程收到服务端返回后,首先查看返回内容的Content-Type
请求头,以确定返回内容的类型。由于Content-Type
请求头可能丢失或错误,所以可能会进行MIME_types 嗅探。根据Content-Type
及嗅探结果,确定返回内容的类型后,Browser进程会根据内容类型进行不同的处理。
- 如果内容是HTML文件,则接下来会会把返回数据交给Render进程进行页面渲染如果内容是zip文件或其他文件等,意味着返回内容是待下载内容,则将数据传递给下载管理器
- 类型的确定不是等到所有内容都下载完才进行,在收到需要的数据之后便可以进行。下面的几部也都是在接受数据的同时同步进行的。
-
另外,在接收到返回内容后,也会对内容进行跨域等安全检查。如果确定内容没有问题,并且属于对应请求的网址,则network进程会告知UI进程数据加载结束,UI进程则会寻找一个Render线程来进行页面渲染
- 为了节省时间,在进行网络请求期间,UI进程会提前确定好后续进行页面渲染的Render线程,当数据加载完毕后,则直接将数据交给之前已经准备好的Render线程。
- 需要注意的是,如果页面被重定向到了一个对于现在域名跨域的域名,则需要另外一个Render进程进行渲染
- 通过以上步骤,数据在加载中,并且已经有准备好的页面渲染的Render线程,则Browser进程通过IPC将数据发送给Render进程,Render进程开始进行网页渲染。
- 当Render进程结束渲染,执行完所有
onload
事件后,通过IPC告知Browser进程,Browser进程的UI线程展示停止"加载中"的指示,显示加载完成。
参考内容
浏览器内部运行机制
从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理