chrome 是多进程,每个进程中,包含了线程
一个进程可以要求操作系统启动另一个进程来运行不同的任务。发生这种情况时,会为新进程分配内存的不同部分。如果两个进程需要对话,它们可以使用Inter Process Communication ( IPC )来实现。许多应用程序被设计为以这种方式工作,因此如果一个工作进程没有响应,它可以重新启动而不停止运行应用程序不同部分的其他进程
浏览器的架构
浏览器可以是一个具有许多不同线程,也可以是具有多个通过IPC通信的线程的不同的进程
进程控制的内容:
浏览器进程(Browser) | 控制浏览器的地址栏、书签、前后退按钮,还处理web浏览器不可见的特权部分,例如网络请求和文件访问 |
---|---|
渲染进程(Renderer) | 控制每个tab下展示的网站 |
插件进程(Plugin) | 控制任何被网站使用的插件,比如flash |
GPU | 独立于其他进程处理 GPU 任务。它被分成不同的进程,因为 GPU 处理来自多个应用程序的请求并将它们绘制在同一个表面上。 |
站点隔离
节省内存
当 Chrome 在强大的硬件上运行时,它可能会将每个服务拆分为不同的进程以提供更高的稳定性,但如果它在资源受限的设备上,Chrome 会将服务整合到一个进程中以节省内存占用。在此更改之前,已在 Android 等平台上使用了类似的整合进程以减少内存使用的方法。
地址栏导航输入
处理输入
当我们在地址栏输入内容时。UI线程首先会询问。这是搜索查询还是URL,在chrome里地址栏也是一个搜索输入字段,所以UI线程需要解析并且决定转到搜索引擎,还是请求的站点地址
开始导航
当用户输入并且点击enter之后,ui线程会发起网络调用获取网站的内容。加载旋转器显示在tab角落,网络线程通过适当的协议,如DNS查找和为请求建立TLS连接
当收到http 301这样的重定向请求,网络线程与UI线程沟通 服务器重定向,将启动另外一个url请求
阅读回复
一旦响应体开始进入,如有必要。网络线程会查看流的前几个字节,响应体里的content-type 头标志了这个数据的类型,如果是html文件,那么下一步将数据传递给渲染器进程,但是如果是一个zip文件活着其他的文件,这将意味着这是一个下载请求,所以会将数据传递给下载管理器
查重一个渲染器进程
一旦所有的检查就绪,并且网络线程确信浏览器应该导航到请求的站点,网络线程就会告诉UI线程,数据准备就绪,UI线程会找到一个渲染器进程来进行网页渲染
多进程
同源的页面会被分配在同一个进程中。而非同源页面会分配一个新的进程
当通过window.open() 打开同一个域名下的页面,会直接使用同一个进程,从chrome 进程管理里可以看得出虽然chrome打开了多个百度,但是不会使用同一个进程,
下面的管理页面是通过window.open()打开就用一个进程,但是如果打开的不同域名的页面,还是单独使用进程