Google Chrome如何在单个应用程序中将标签隔离到单独的进程中?

时间:2010-01-07 10:13:31

标签: architecture browser google-chrome multiprocess

我们被告知Google Chrome会在单独的流程中运行每个标签。因此,一个选项卡中的崩溃不会导致其他选项卡出现问题。

AFAIK,多进程主要用于没有GUI的程序。我从来没有读过任何可以将多个GUI流程嵌入到单个GUI流程中的技术。

Chrome如何做到这一点?

我问这个问题是因为我正在设计CCTV软件,它将使用来自多个相机制造商的视频解码SDK,其中一些远非稳定。所以我更喜欢在不同的流程中运行这些SDK,我认为这与Chrome类似。

5 个答案:

答案 0 :(得分:42)

基本上,他们使用另一个过程将它们全部粘合到GUI中。

Google Chrome会创建三种不同类型的流程:浏览器,渲染器和插件。

浏览器:只有一个浏览器进程可以管理浏览器的标签,窗口和“chrome”。此过程还处理与磁盘,网络,用户输入和显示的所有交互,但它不会尝试从Web解析或呈现任何内容。

呈现器:浏览器进程会创建许多渲染器进程,每个进程负责呈现网页。渲染器进程包含用于处理HTML,JavaScript,CSS,图像等的所有复杂逻辑。 Chrome使用开源WebKit渲染引擎实现了这一点,该引擎也被Apple的Safari Web浏览器使用。每个渲染器进程都在沙箱中运行,这意味着它几乎不能直接访问磁盘,网络或显示器。与Web应用程序的所有交互(包括用户输入事件和屏幕绘制)都必须通过浏览器进程。这使得浏览器进程可以监视渲染器是否存在可疑活动,如果它怀疑漏洞已经发生,则会将其杀死。

插件:浏览器进程还为正在使用的每种类型的插件创建一个进程,例如Flash,Quicktime或Adobe Reader。这些进程只包含插件本身,以及一些粘合代码,以便它们与浏览器和渲染器进行交互。

来源:Chromium Blog: Multi-process Architecture

答案 1 :(得分:18)

在这种情况下,基本设计很有意思。

以下是相关的design documents,特别是multi-process architecture部分。

架构概述:

Architectural overview of browser threads

答案 2 :(得分:0)

渲染网页的大部分工作都在弄清楚事情的确切位置(即每张图片的放置位置,呈现每段文字的颜色)。这项工作是在一个单独的过程中完成的。一旦单独的流程确定了所有内容的位置,它就会将该信息传递给主要的Chrome流程,该流程会绘制屏幕上的所有元素。

目前尚不清楚您的视频sdk系统是如何设置的。但是你可以有一个解压缩视频的进程和另一个将它呈现给显示器的进程。但最有可能的是,您使用的是opengl或DirectX。那些API对你如何在不同的进程中分裂提出了一些限制。

答案 3 :(得分:0)

我刚给出了第一个答案(解释'浏览器'vs'渲染器'与'插件'的答案 一个上升......这似乎是最完整的,对我来说很有意义。

我要添加的唯一内容只是关于为什么谷歌的设计更多的评论 就是它的样子,并就为什么它始终是我的第一选择给出意见 对于整体/每日浏览器。 (我知道如何(而不是为什么) 被问到的问题。)

设计使各个组件的代码在不同的进程中允许 操作系统“记忆保护”过程意外(或故意)修改每个过程 其他未明确设计的方式。

这种设计中唯一可以读写共享数据的部分就是那些 设计为需要访问该数据的部件,并允许控制是否 该访问只是“读取”访问或“读取”和“写入”访问等。并且,从那以后 这些访问控制是在硬件中实现的,它们是坚定的保证 不能违反访问规则。因此,插件和扩展 来自其他作者和公司,在单独的选项卡/进程中运行,不能 互相打破。

这样的设计具有最小化改变机会的效果 一些未设计为可更改的代码或数据。这是为了安全 原因并使得更可靠,更少错误的代码。

对于我来说,谷歌拥有如此错综复杂的设计这一事实是一个很好的见证 事实上,谷歌似乎对这些概念有着极好的把握 建立了卓越的产品。 (也就是说,作为网络开发者,我们仍然必须进行测试 我们的Web代码有多个浏览器。而且,像Firefox这样的浏览器 已经存在了很长时间并且拥有一群优秀的网络开发人员 “附加组件”对某些任务仍有一些优势。)

但是,对于日常整体浏览器使用,几乎所有任务,Chrome浏览器 已成为我的第一选择。 (只是我的意见,当然还有YMMV。)

答案 4 :(得分:-2)

窗口对象 - 用于实现窗口小部件的小型可绘制矩形区域,而不是用户看到的窗口 - 可以使用共享内存或X协议在进程之间完美共享。检查您的工具包的文档。