Google Chrome如何将单个标签隔离到单独的进程中,同时看起来像是单个应用程序?

我们被告知,谷歌浏览器在一个单独的过程中运行每个选项卡。 因此,一个选项卡中的崩溃不会导致其他选项卡出现问题。

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

Chrome如何做到这一点?

我在问这个问题,因为我在deviseCCTV软件,它将使用来自多个相机制造商的video解码SDK,其中一些远不稳定。 所以我更喜欢在不同的stream程中运行这些SDK,我认为这与Chrome相似。

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

Google Chrome会创build三种不同types的stream程:浏览器,渲染器和插件。

浏览器:只有一个浏览器进程,它pipe理浏览器的选项卡,窗口和“chrome”。 该过程还处理与磁盘,networking,用户input和显示的所有交互,但不会尝试从networking分析或呈现任何内容。

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

插件:浏览器进程还为正在使用的各种types的插件(如Flash,Quicktime或Adobe Reader)创build一个进程。 这些进程只包含插件本身,以及一些胶水代码,让他们与浏览器和渲染器进行交互。

来源: Chromium博客:多进程架构

由于这是一个开发人员站点,很奇怪的是,没有人链接到devise文档 ,特别是多进程体系结构部分。

这里是架构概述:

浏览器线程的架构概述

渲染一个网页的大部分工作是确定事情发生的地方(例如,放置每张图片的位置,呈现每一段文本的颜色)。 这项工作是在一个独立的过程中完成的。 一旦单独的进程计算出所有内容,就会将这些信息传递给主要的Chrome进程,从而在屏幕上绘制所有的元素。

目前尚不清楚您的videosdk系统是如何设置的。 但是,你可以有一个解压缩video的过程,另一个过程将其呈现给显示器。 然而,最有可能的是,你正在使用opengl或DirectX。 这些API对于如何在不同进程之间进行分割有些限制。

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

我唯一要添加的只是关于为什么Google的devise就是这样的一些评论,并给出了一个意见,说明为什么它总是我的首选/全天浏览器。 (我意识到如何(而不是为什么)是被问到的问题。)

devise使单个组件在不同的进程中拥有自己的代码,可以让操作系统“意外”(或者故意)修改对方的内存,而不是以明确的方式修改对方。

这种devise中唯一可以读取和写入共享数据的部分是那些被devise为需要访问该数据的部分,并且允许控制该访问是“读”访问还是“读”和“写”访问等等。而且,由于这些访问控制是在硬件中实现的,所以它们是不能违反访问规则的坚定保证。 因此,来自其他作者和公司的插件和扩展,在单独的标签页/进程中运行,不能相互破坏。

这样的devise具有这样的效果,即它最小化了改变一些没有被devise为改变的代码或数据的机会。 这是出于安全原因,使更可靠,lessbug的代码。

谷歌这样一个复杂的devise的事实,对我来说,很好的certificate,谷歌似乎有一个很好的把握这些概念,并build立了一个优秀的产品。 (也就是说,作为一个web开发者,我们仍然必须用多种浏览器来testing我们的web代码,而像Firefox这样的浏览器已经存在了很长时间,并且拥有一组优秀的web开发者相关的附加组件,对于某些任务仍然有一些优势。)

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

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

Interesting Posts