倡议浏览
浏览器多过程架构
https://segmentfault.com/a/1190000023603263
背景
所有浏览器网络通信都是由浏览器主过程执行。有一些起因:
- 对立管制各个渲染过程的网络通信
- 便于管理和保护跨过程的会话、状态治理,如cookies和cache
- 作为HTTP/1.1,对于每个host连接数有限度,对立管制
架构概览
浏览器多过程利用能够大抵分为三层。
最底层是Blink负责渲染页面。再上一层是渲染过程,每一个渲染过程蕴含一个Blink实例。最上一层是浏览器过程(主过程)负责管理所有渲染过程,同时治理全局网络拜访。
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引擎。