浏览器多进程资源加载

建议阅读

浏览器多进程架构
https://segmentfault.com/a/1190000023603263

背景

所有浏览器网络通信都是由浏览器主进程执行。有一些原因:

  • 统一控制各个渲染进程的网络通信
  • 便于管理和维护跨进程的会话、状态管理,如cookies和cache
  • 作为HTTP/1.1,对于每个host连接数有限制,统一控制

架构概览

浏览器多进程应用可以大致分为三层。
最底层是Blink负责渲染页面。再上一层是渲染进程,每一个渲染进程包含一个Blink实例。最上一层是浏览器进程(主进程)负责管理所有渲染进程,同时管理全局网络访问。

image

Blink

它有一个ResourceLoader负责获取数据,每一个ResourceLoader有一个WebURLLoader负责实际分发数据请求。ResourceLoader还实现了WebURLLoaderClient协议,这个协议能让渲染进程分发数据,能让Blink获取一些事件,从而进行处理。

渲染进程

渲染进程负责实现WebURLLoader,为WebURLLoaderImpl,它使用每个渲染进程对应的ResourceDispatcher创建一个唯一的请求(Unique ID),并将这个请求通过IPC通信转发给浏览器主进程。当浏览器获得响应后再根据唯一请求Unique ID将响应数据返回给目标对象。

浏览器主进程

RenderProcessHost对象拿到渲染进程的转发请求后,将请求转发给全局的ResourceDispatcherHost,使用指针(具体而言,是ResourceDispatcherHost::Reciver对象)指向发请求的渲染进程以及识别到该具体的请求,然后请求被转化成URLRequest,进一步转化成其内部的URLRequestJob,当URLRequest获得响应消息后,再给具体的ResourceDispatcherHost::Reciver对象。

Cookies

所有的cookies都是由CookieMonster对象处理,cookies是不能被其它浏览器网络栈共享的。因为cookies是跨tabs的,所以CookieMonster是在浏览器主进程中的。页面获取cookies比如使用document.cookie时,会从渲染进程发出一个同步获取信号至浏览器主进程,此刻若浏览器主进程正在处理cookies,会暂停blink此刻的工作线程。当渲染进程收到浏览器主进程的I/O响应时,才会重启blink的工作线程并将cookies结果返回给JavaScript引擎。

你可能感兴趣的:(前端,浏览器)