Chromium文档学习(一)--多线程结构

本文为作者学习Chromium开发文档所做的笔记,类似于主要文档翻译,穿插一些注释和个人理解。干货不多,请见谅。

本篇参考文档 Multi-process Architecture

问题的引入

  1. 用不崩溃和挂起的渲染引擎(Rendering engine)几乎不存在(nearly impossible),完全安全的渲染引擎也几乎不存在。
  2. 旧式浏览器(类似旧式操作系统:单用户/多任务协作,某应用损坏导致系统崩溃)中的某个网页问题或者插件bug可能导致整个浏览器和所有标签页崩溃。
  3. 新式的系统将应用之间使用进程进行隔离,某一应用崩溃不会导致其他应用或整个系统崩溃,用户之间的数据管理也更加严格。

多进程架构总览

  1. 为不同的标签使用不同的进程,以防止渲染引擎的bug导致整个应用的崩溃。
  2. 限制渲染引擎之间的访问,对操作系统的访问,以及对其他用户数据的访问。
  3. 主进程主要负责运行UI,管理标签和插件进程。称为浏览器进程或浏览器。
  4. 标签进程使用WebKit开源排版引擎(layout engine,与渲染引擎为同一wiki词条)进行解释和HTML排版。称为渲染器或者渲染器进程。
    > 注:2013年 Google从WebKit分支出Blink引擎,Chrome和Opera新版本均采用blink。

管理渲染器进程

  1. 每个渲染器都拥有一个全局的RenderProcess对象,用来管理与浏览器府进程进行通信和维护全局状态。
  2. 浏览器为每个渲染器维护一个相应的RenderProcessHost对象,用来管理浏览器状态和与渲染器通信
  3. 渲染器和浏览器之间使用Chromium's IPC system进行通信。

管理视图(views)

  1. 每个渲染其拥有一个或多个RenderView对象,由RenderProcess控制,对应内容中的标签。

    多个view对象情况:进程过多需要合并,使用windows.open等语句打开的标签或者其他需要在两个标签之间同步的情况等。

  2. 浏览器中对应的RenderProcessHost维护一个RenderViewHost对象对应于渲染器中的每个view。
  3. 每个view都有一个ID,用来在同一渲染器中区分view,该Id在渲染其中是唯一的,但是在浏览器中不唯一,所以识别一个view需要一个RenderProcessHost对象和一个view ID。
  4. 浏览器和渲染器中特定标签的通信需要通过RenderViewHost对象,这些对象明白如何将信息从RenderProcessHost传递给RenderProcess后再传递给RVenderiew。

组件和接口

  • 渲染器进程

    1. RenderProcess进程负责与浏览器进程中RenderProcessHost进程进行通信。每个渲染器都只有一个对应的host进程。
    2. RenderView对象与浏览器中对应的RenderViewHost进行通信(通过RenderProcess),同时也和嵌入的WebKit进行通信。这个对象代表了一个标签中的一个网页的内容或者一个弹出窗口。
  • 浏览器进程

    1. Brower对象代表了一个顶层的浏览器窗口。
    2. RenderProcessHost对象代表一个浏览器端的浏览器--渲染其之间的IPC连接。
    3. RenderViewHost对象封装了与远程RenderView之间的连接,RenderWidgetHost处理浏览器中RenderWidget的输入和绘制。

    关于内嵌机制的更多内容,见How Chromium displays web pages

共享渲染器进程

  1. 一般来说,每个窗口和标签都是在新进程中打开的,浏览器会创建一个新进程并且指示创建一个RenderView.
  2. 但有时有必要或者有意愿在标签或窗口之间共享。给新标签或窗口制定已经存在的进程。

    • 一个网络应用使用windows.open打开一个新窗口,希望能与该窗口实时通信。
    • 进程总数太大。
    • 已经有一个进程打开了相同的网址。
      更多策略说明在Process Models.

检测崩溃或出错的渲染器

  1. 每个连接到浏览器的IPC连接都监视进程句柄。当句柄发送信号时,渲染器已经崩溃,而且对应的标签都会被通知。
  2. 之后浏览器显示“sad tab”并且通知用户,由用户决定刷新或者重新导航。当崩溃发生时,进程就被杀死并写创建新进程。

为渲染器添加沙盒

  1. 由于WebKit晕次那个在分开的进程中,所以浏览器可以限制其访问系统资源。

    • 保证渲染器只能通过浏览器父进程访问网络。
    • 使用操作系统内置的权限来限制访问操作系统的文件系统。
  2. 限制进程访问用户显示和相关的对象,防止渲染其打开新窗口或者获取按键信息。

内存回收

  1. 隐藏标签的进程优先级低。
  2. 类似于windows的内存管理(低优先级的进程内存会被交换到硬盘上),浏览器也会在必要时进行相似的操作,导致相关标签的性能降低。
  3. 在低内存环境下,切换到常用标签会比切换到不常用的标签快(内存够用时不会发生此类情况)。

你可能感兴趣的:(多线程)