进程模型

所有已识别的进程类型都在 GeckoProcessTypes 中定义。

有关 IPC 如何添加和管理进程类型的更多详细信息,请参阅进程创建文档 Gecko 进程

图表

digraph processtypes {
compound=true;
node [shape=rectangle];

launcher [label=<Launcher Process>]
parent [label=<Parent Process>]

subgraph cluster_child {
    color=lightgrey;
    label=<Child Processes>;

    subgraph cluster_content {
        color=lightgrey;
        label=<Content Processes>;

        web [
            color=lightgrey;
            label=<
                <TABLE BORDER="0" CELLSPACING="5" CELLPADDING="5" COLOR="black">
                    <TR><TD BORDER="0" CELLPADDING="0" CELLSPACING="0">Web Content</TD></TR>
                    <TR><TD BORDER="1">Shared Web Content<BR/>(<FONT FACE="monospace">web</FONT>)</TD></TR>
                    <TR><TD BORDER="1">Isolated Web Content<BR/>(<FONT FACE="monospace">webIsolated=$SITE</FONT>)</TD></TR>
                    <TR><TD BORDER="1">COOP+COEP Web Content<BR/>(<FONT FACE="monospace">webCOOP+COEP=$SITE</FONT>)</TD></TR>
                    <TR><TD BORDER="1">ServiceWorker Web Content<BR/>(<FONT FACE="monospace">webServiceWorker</FONT>)</TD></TR>
                </TABLE>
            >
        ]

        nonweb [
            shape=none;
            label=<
                <TABLE BORDER="0" CELLSPACING="5" CELLPADDING="5" COLOR="black">
                    <TR><TD BORDER="1">Preallocated Content<BR/>(<FONT FACE="monospace">prealloc</FONT>)</TD></TR>
                    <TR><TD BORDER="1">File Content<BR/>(<FONT FACE="monospace">file</FONT>)</TD></TR>
                    <TR><TD BORDER="1">WebExtensions<BR/>(<FONT FACE="monospace">extension</FONT>)</TD></TR>
                    <TR><TD BORDER="1">Privileged Content<BR/>(<FONT FACE="monospace">privilegedabout</FONT>)</TD></TR>
                    <TR><TD BORDER="1">Privileged Mozilla Content<BR/>(<FONT FACE="monospace">privilegedmozilla</FONT>)</TD></TR>
                </TABLE>
            >
        ]
    }

    helper [
        color=lightgrey;
        label=<
            <TABLE BORDER="0" CELLSPACING="5" CELLPADDING="5" COLOR="black">
                <TR><TD BORDER="0" CELLPADDING="0" CELLSPACING="0">Helper Processes</TD></TR>
                <TR><TD BORDER="1">Gecko Media Plugins (GMP) Process</TD></TR>
                <TR><TD BORDER="1">GPU Process</TD></TR>
                <TR><TD BORDER="1">VR Process</TD></TR>
                <TR><TD BORDER="1">Data Decoder (RDD) Process</TD></TR>
                <TR><TD BORDER="1">Network (Socket) Process</TD></TR>
                <TR><TD BORDER="1">Utility Process</TD></TR>
                <TR><TD BORDER="1">Fork Server</TD></TR>
            </TABLE>
        >
    ]
}

subgraph { rank=same; launcher -> parent; }

parent -> web [lhead="cluster_content"];
parent -> helper;
}

Firefox 使用的进程图表。所有子进程都由父进程生成和管理。

父进程

remoteType:

null

其他名称:

UI 进程、主进程、Chrome 进程、浏览器进程、默认进程、代理进程

沙盒化?:

父进程是处理 Firefox 核心功能的主要进程,包括其 UI、配置文件、进程选择、导航等。父进程负责启动所有其他子进程,并充当在它们之间建立通信的代理。

所有主要协议都在父进程和给定的子进程之间建立连接,然后可以使用该连接与其他进程建立其他连接。

由于父进程可以显示 HTML 和 JS,例如浏览器 UI 和特权内部页面(如 about:preferencesabout:config),因此进程选择逻辑通常将其视为具有 *null* 远程类型的內容进程。父进程具有额外的保护措施,以确保在多进程模式下运行时无法加载不受信任的代码。为此,任何尝试在父进程中加载 Web 内容的操作都会导致浏览器崩溃,并且所有进出父进程文档的导航都会立即执行完全隔离,以防止内容进程操作它们。

内容进程

主要协议:

PContent

其他名称:

渲染器进程

沙盒化?:

是(内容沙盒策略)

内容进程用于加载 Web 内容,并且是唯一(除了父进程之外)可以加载和执行 JS 代码的进程类型。这些进程进一步细分为特定的“远程类型”,这些类型指定在其中加载的内容类型、它们的沙盒行为,并且可以控制对某些特权 IPC 方法的访问。

用于特定资源的特定远程类型和隔离行为目前在两个主要位置控制。执行文档导航时,加载文档的最终进程由 ProcessIsolation.cpp 中的逻辑选择。这将结合有关特定响应(例如站点和标头)的信息以及其他状态,以选择应采取哪些进程和其他隔离操作。在为新标签选择创建初始进程的进程以及为服务工作线程和共享工作线程选择进程时,E10SUtils.sys.mjs 中的逻辑用于选择进程。将来可能会删除 E10SUtils.sys.mjs 中的逻辑并将其替换为 ProcessIsolation.cpp

注意

Chromium 使用“渲染器”作为其内容进程的等效名称,并且由于进程架构的相似性,偶尔也在 Gecko 中使用。实际的渲染和合成步骤在 GPU 或主进程中执行。

预分配内容

remoteType:

prealloc

默认计数:

3 (dom.ipc.processPrelaunch.fission.number,如果禁用 Fission 则为 1)

为了避免在导航时需要启动新的内容进程来托管新内容,在请求时会预先启动和专门化新的内容进程。这些预分配的内容进程永远不会加载内容,并且必须在使用前进行专门化。

预分配进程的数量会根据各种因素而有所不同,例如主机系统中可用的内存。

prealloc 进程无法用于启动 file 内容进程,因为它们的 OS 沙盒被削弱了。extension 内容进程由于 Bug 1637119 目前也不受支持。

文件内容

remoteType:

file

默认计数:

1 (dom.ipc.processCount.file)

功能:

文件系统访问

文件内容进程用于加载 file:// URI,因此比其他内容进程的沙盒化程度更低。如果浏览器使用过时的 CAPS 首选项允许该站点访问本地资源,它也可能用于加载远程 Web 内容(请参阅 Bug 995943

WebExtensions

remoteType:

extension

默认计数:

1 (dom.ipc.processCount.extension)

功能:

扩展 API、共享内存 (SharedArrayBuffer)

WebExtension 内容进程用于加载后台页面和顶级 WebExtension 框架。由于加载具有访问完整 WebExtension API 表面的特权扩展页面,因此此进程通常可以访问提升的权限。目前,所有扩展都共享一个内容进程。

在扩展进程中加载的特权扩展还可以使用 SharedArrayBuffer 授予对共享内存的访问权限。

注意

moz-extension:// 子框架目前加载在与父文档相同的进程中,而不是在 extension 内容进程中,这是由于现有的权限行为授予内容脚本访问扩展子框架内容的能力。这将来可能会发生变化。

特权内容

remoteType:

privilegedabout

默认计数:

1 (dom.ipc.processCount.privilegedabout)

功能:

受限的 JSWindowActor API

privilegedabout 内容进程用于加载具有访问内部状态的特权的内部页面。通过在相应的 nsIAboutModule 中包含 nsIAboutModule::URI_MUST_LOAD_IN_CHILDnsIAboutModule::URI_CAN_LOAD_IN_PRIVILEGEDABOUT_PROCESS 标记,可以请求使用 privilegedabout 内容进程。

截至 2021 年 8 月 11 日,以下内部页面加载到特权内容进程中:about:loginsabout:loginsimportreportabout:privatebrowsingabout:homeabout:newtababout:welcomeabout:protectionsabout:certificate

为这些内部 about 页面提供特殊 API 访问权限的各种 JSWindowActor 实例仅限于通过 remoteTypes 属性在此内容进程中可用,这将阻止尝试从其他内容进程中使用它们。

特权 Mozilla 内容

remoteType:

privilegedmozilla

默认计数:

1 (dom.ipc.processCount.privilegedmozilla)

域名:

addons.mozilla.orgaccounts.firefox.com (browser.tabs.remote.separatedMozillaDomains)

功能:

受限的加载项管理器 API

privilegedmozilla 内容进程用于加载已授予访问特权功能的特定高价值 Mozilla 控制网页。为了为这些站点提供额外的安全层,即使在禁用 Fission 时,它们也会在与其他 Web 内容不同的进程中加载。

此单独的远程类型还用于在 IPC 边界控制对某些高权限 Web API 的访问,例如与已安装扩展 API 交互的能力。

Web 内容进程

这些进程的远程类型都以 web 开头,用于托管常规不受信任的 Web 内容。Web 内容进程的不同变体在不同的时间使用,具体取决于页面请求的隔离策略和浏览器的配置。

共享 Web 内容

remoteType:

web

默认计数:

8 (dom.ipc.processCount)

共享网页内容进程用于托管未隔离到其他网页内容进程类型的网页内容。这包括几乎所有禁用了 Fission 的网页内容,以及在启用了 Fission 后无法归因于特定来源的网页内容,例如用户发起的 data: URI 加载。

推理内容

remoteType:

推理

默认计数:

1 (dom.ipc.processCount.inference)

推理内容进程用于隔离推理运行时,目前包括 ONNX 运行时和 Bergamot。此进程托管运行 WASM 运行时的 Chrome 工作线程以及一些 Javascript,以执行翻译或图像到文本等推理任务。

这些模型可以分配大量内存,这可能导致进程在 Android 等内存受限的环境中被操作系统杀死。这种隔离确保了其他重要进程(如内容进程)不会被杀死。

隔离的网页内容

remoteType:

webIsolated=$SITE

默认计数:

每个站点 1 个 (dom.ipc.processCount.webIsolated)

隔离的网页内容进程用于托管启用了 Fission 且可归因于特定站点的网页内容。这些进程在导航时分配,并且只加载来自指定站点的网页内容。当 Fission 被禁用时,不会使用隔离的网页内容进程。

每个加载的站点使用不同的 webIsolated= 远程类型,因此使用不同的进程池,并且还对不同的容器标签和隐私浏览进行隔离。

COOP+COEP 网页内容

remoteType:

webCOOP+COEP=$SITE

默认计数:

每个站点 1 个 (dom.ipc.processCount.webCOOP+COEP)

功能:

共享内存(SharedArrayBuffer)

当加载同时配置了 Cross-Origin-Opener-PolicyCross-Origin-Embedder-Policy 标头的顶级文档时,该文档正在请求访问共享内存。出于安全原因,我们仅向充分隔离的页面提供此 API 访问权限,并且我们将其加载到特殊的隔离内容进程中。

与隔离的网页内容类似,这些进程以加载到其中的站点为键,并根据容器标签和隐私浏览进行分段。

注意

此进程的另一个名称可能是“跨源隔离的网页内容”,以对应于为设置了这些标头的文档加载而设置的 window.crossOriginIsolated 属性。不幸的是,这可能会与 Fission 的“隔离的网页内容”进程混淆,因为该属性是在 webIsolated 远程类型已在使用后命名的。

about:processes 中,COOP+COEP 网页内容进程将在 PID 后列出“跨源隔离”注释,例如 https://example.com (12345, cross-origin isolated)

ServiceWorker 网页内容

remoteType:

webServiceWorker=$SITE

默认计数:

每个站点使用 ServiceWorkers 1 个

ServiceWorker 网页内容进程用于基于每个站点托管 ServiceWorkers,以便在与页面内容位于同一进程中运行时,ServiceWorker 操作不受主线程事件延迟的影响。ServiceWorkers 通常是短暂的,如果在短时间内未使用,将消失。

Gecko 媒体插件 (GMP) 进程

主要协议:

PGMP

沙盒化?:

是(GMP 沙箱策略)

GMP 进程用于在沙箱环境中沙箱化用于媒体播放的第三方“内容解密模块”(CDM)二进制文件。仅在加载启用 DRM 的内容时才会启动此进程。

GPU 进程

主要协议:

PGPU

其他名称:

合成器进程

沙盒化?:

否(bug 1347710 跟踪 Windows 上的沙箱化)

GPU 进程执行合成,并用于与隔离进程中的 GPU 硬件通信。这有助于隔离诸如 GPU 驱动程序崩溃之类的事情,以防止影响整个浏览器,并且将来允许对该代码进行沙箱化。此外,当 GPU 进程可用时,一些组件(如 Windows Media Foundation (WMF))会在其中运行。

并非所有平台都使用 GPU 进程。不使用它的平台(例如 macOS 和某些 Linux 配置)将在父进程的后台线程上执行合成。

VR 进程

主要协议:

PVR

沙盒化?:

否(bug 1430043 跟踪 Windows 上的沙箱化)

VR 耳机库需要访问特定的操作系统级功能和其他要求,我们通常希望在其他进程的沙箱中阻止这些功能。为了允许 GPU 进程具有更严格的沙箱规则,这些 VR 库加载到限制较少的 VR 进程中。与 GPU 进程一样,这有助于将其与 Firefox 的其余部分隔离,并减少这些库中的错误对浏览器其余部分的影响。仅在用户访问使用 WebVR 的站点后才会启动 VR 进程。

数据解码器 (RDD) 进程

主要协议:

PRDD

沙盒化?:

是(RDD 沙箱策略)

此进程用于在其自己的沙箱进程中运行媒体数据解码器,允许将代码与 Gecko 中的其他代码隔离。这旨在降低媒体解码器库中潜在错误的严重性,并提高浏览器的安全性。

注意

此进程正在被重构为一种通用的“实用程序”进程类型,用于在最大安全沙箱中运行不受信任的代码。这些更改后,将存在以下新的进程类型,替换 RDD 进程

  • Utility:用于托管不需要访问操作系统资源的不受信任代码的最大沙箱进程。此进程在 Windows 上的沙箱化程度甚至比今天的 RDD 进程更高,其中 RDD 进程可以访问 Win32k。

  • UtilityWithWin32k:仅 Windows 的进程,具有与今天的 RDD 进程相同的沙箱化。这将用于托管需要访问 Win32k 以允许直接解码到 GPU 表面的不受信任的沙箱代码。

  • GPUFallback:仅 Windows 的进程,使用 GPU 进程的沙箱策略,当 GPU 进程本身不可用时,将用于运行 Windows Media Foundation (WMF),从而允许 UtilityWithWin32k 在 Windows 上重新启用任意代码保护 (ACG)。

有关计划的实用程序进程架构更改的更多详细信息,请参阅规划文档

网络(套接字)进程

主要协议:

PSocketProcess

沙盒化?:

是(套接字沙箱策略)

套接字进程用于将某些网络操作与父进程分离,允许在部分沙箱进程中更直接地执行它们。最终目标是将所有 TCP/UDP 网络操作移至此专用进程,并在Bug 1322426中跟踪。

分叉服务器

平台:

仅限 Linux

首选项:

dom.ipc.forkserver.enable(在 Nightly 中默认启用)

主要协议:

沙盒化?:

否(分叉服务器分叉的进程已沙箱化)

分叉服务器进程用于减少新进程的内存开销并提高启动效率。当请求新的受支持进程并且启用了该功能时,父进程将要求分叉服务器fork(2)自身,然后开始执行。这避免了重新加载 libxul.so 和重新执行重定位的需要。

分叉服务器必须在初始化 XPCOM 或 IPC 层之前运行,因此使用称为 MiniTransceiver 的自定义低级 IPC 系统而不是 IPDL 进行通信。

启动器进程

平台:

仅限 Windows

元错误:

Bug 1435780

沙盒化?:

启动器进程用于在启动主 Firefox 进程之前引导 Windows 上的 Firefox,允许在主线程甚至开始运行之前初始化 DLL 注入阻止等操作,从而提高稳定性。与其他实用程序进程不同,此进程不是由父进程启动的,而是启动父进程。

IPDLUnitTest

主要协议:

变化

此仅测试进程类型旨在用于编写 IPDL 单元测试。但是,它目前已损坏,因为这些测试从未在 CI 中运行过。当这些单元测试修复后,该类型可能会被删除或重新使用。

实用程序进程

主要协议:

PUtilityProcess

元错误:

Bug 1722051

沙盒化?:

是,可自定义

实用程序进程用于提供一种简单的方法来实现 IPC actor,并具有一些更具体的沙箱属性,在您不需要或不想处理添加全新进程类型的额外复杂性但只想应用不同的沙箱策略的情况下。详细信息可以在实用程序进程中找到。