极客时间-李兵-
浏览器工作原理与实践学习回顾总结。
线程和进程
一个进程类似一块代码实例,一个进程可以用多个线程并行处理,以提高运行效率。
多线程中任一线程执行出错都会导致整个进程的崩溃。
线程之间共享进程的数据。
当一个进程关闭之后,操作系统会回收这个进程占用的内存。
进程之间内容相互隔离。
可以`类比`函数中代码块(或者说函数),
一个代码块就是一个进程,代码块的返回结果就是进程的返回结果。
几个不同的计算部分可以分别计算,最后一步整合计算返回结果。
既然最后要整合计算,那应该有一个公共池子能共享每个线程的结果。
当计算出最终结果之后,过程不再重要,可以将其中的内存回收(销毁)。
而无关的代码块之间相互隔离,防止数据泄露。
所谓单进程浏览器即所有页面所有计算都在同一个进程里,
不稳定:如上所说,任一线程崩溃都会引发进程崩溃。单进程时代各插件横行,视频、游戏等都需要插件,在一个进程运行这么多插件很难不保证不出差错。
不流畅:如果某个线程崩溃,或者某个模块用的时间太久,就会产生阻塞,别的都做不了了。另外内存泄漏也算一点,浏览器内核很复杂,打开一个复杂页面再关闭,很难把所有内存完全回收。
不安全:插件用c/c++等代码编写,通过插件获取操作系统资源,打开一个页面运行某个插件的时候,这个插件可以完全操控你的电脑。如果是个恶意插件,那他可能会使防病毒、盗取账户密码等。
多进程浏览器怎么解决不稳定、不流畅、不安全的问题的?
早期多进程浏览器
一个页面多进程(插件进程、渲染进程、浏览器主进程),进程间相互隔离。每个进程负责不同的内容、不同的事情、每个进程对应的权限也不一样。(进程间通信通过IPC机制)。
解决不稳定、不流畅:进程相互隔离,一个页面的一个进程崩溃不会影响当前页面其他进程以及其他页面进程。解决内存泄漏也只要回收整个进程就可以,进程之间相互隔离,完美。
解决不安全:多进程的额外好处是安全沙箱。可以类比只给进程部分权限,写入、读取敏感数据的权限都不给。这样恶意程序就没办法操作了。
目前多进程架构
现在的Chrome进程架构:
1个浏览器主进程、1个GPU进程、1个网络进程、多个渲染进程、多个插件进程。
浏览器进程:界面展示、用户交互、子进程管理、同时提供存储等功能。
渲染进程:核心任务是将HTML、CSS、JavaScript转换为用户可以交互的网页。
排版引擎Blink和JavaScript引擎V8都运行在该进程中。
默认情况下,Chrome会为每个Tab标签创建一个渲染进程。出于安全考量,
如果两个网页在同一站点下,会共用一个渲染进程。
渲染进程运行在沙箱模式下。
Chrome有些进程不会显示出来,比如预渲进程,有一个额外的渲染进程提前开启,等有渲染基础你哼的需求的时候,就直接使用这个预渲进程,省去创建进程的时间。
GPU进程:渲染UI、绘制页面。
一开始没有,加上的初衷是为了渲染3D CSS效果。后来网页、Chrome的UI都开始用GPU绘制,GPU成为广泛需求,Chrome就在多进程架构上加上了GPU。
网络进程:网络资源加载。
之前作为浏览器进程的一个模块,后面才独立出来。
主要通过HTTP、HTTPS等协议从服务器下载资源,包括文档、文件、图片等资源。
插件进程:负责插件运行。
确保插件崩溃不会影响页面。
一个问题:
为什么单进程不能使用安全沙箱?
浏览器主线程需要读写操作、需要敏感数据的权限。
多线程弊端:
更多资源占用:因为每个进程都要包含公共基础结构的副本,比如JavaScript运行环境。这就意味着浏览器消耗更多内存资源。
更复杂的体系结构:浏览器各个模块之间耦合性高、难以改变、以至于现架构难以适应新需求。
未来面向服务的架构
2016,Chrome官方团队使用面向服务的架构思想设计了新的Chrome架构。
原先各种模块将会重构为独立的服务,每个服务都可以在独立的进程中运行,访问服务必须通过事先定义好的接口,通过IPC通信。
构建一个更内聚、松耦合、易于维护和扩展的系统。
我的理解:把一些进程当作公共架构,页面需要什么服务就启动什么进程,多个页面共同的服务可以共用一个进程。像渲染进程、插件进程则可以开启多个。
Chrome“面向服务的架构”进程模型图:
在资源不足的设备上,将服务合并到浏览器进程中: