chromium学习:进程模型

本文介绍了Chromium浏览器的多进程模型及其带来的稳定性提升。详细解释了四种进程模型:Process-per-site-instance、process-per-site、process-per-tab 和 single-process 的工作原理,并简要提及了沙盒进程和插件进程的作用。

    在我们继续我们的源码分析之前,我们先来补一下基础。


    今天,我们一起看一下chromium的进程模型。


    当年chrome刚出来的时候,多进程模型也是大力宣传的一点。那么多进程有什么好处呢?


    chromium的官方文档是这么解释的:以前,我们的浏览器就像旧时代的操作系统,单用户协同工作的多任务操作系统。一个恶意的程序就能使得整个操作系统崩溃。同样,一个恶意的网页也能使得浏览器崩溃。现代操作系统把这些用用程序分割在不同的进程里面,进程之间有很好的保护,这样,一个进程崩溃了不会影响到其他进程,更不会影响到操作系统。基于同样的道理,浏览器应该像操作系统一样向多进程模型演进。

    很有道理,是不是?

 

   那么,chromium支持哪些进程模型呢?这里我大致介绍一下,因为我发现这里可能有很多误解。


    1. 默认的,Process-per-site-instance。这个类似javascript的同源策略,不过不同的是,把子域以及含端口的网站也划拉进来了。也就是说,这些都会用一个进程。


    2. process-per-site。启动选项 --process-per-site。这个模型除了1的同源策略外,增加了一项,对于同一个网站,维护一个进程。比如在一个tab里面打开了http://blog.youkuaiyun.com/awebkit,然后在另一个tab里面同样打开http://blog.youkuaiyun.com/awebkit,使用此模式,发现他们是在同一个进程内。


  3.process-per-tab。启动选项--process-per-tab。这可不是一个tab一个进程。由javascript连接的tab在一个进程内。也就是说,打开一个tab,然后只要是通过javascript打开的tab都会在同一个进程内。如果手动打开一个新tab,则会增加一个新进程。


  4. single-process。启动选项--single-process。这个就是传统的单进程模式。学习chromium的时候很有用哦


  上面说的都是render进程。那chromium中还有别的进程吗?

  其他的进程:沙盒进程和插件进程。所有的render进程不是直接使用资源的,而是通过沙盒进程。关于沙盒部分,以后再详细介绍。插件也会运行在独立的进程。


  好了,chromium支持的进程模型大致这些。

  然后我们来看看多进程之间是如何协同工作的。


  仔细看看下面这张图:



   




 

### Chromium进程架构原理及实现机制 Chromium 的多进程架构是一种为了提高浏览器稳定性和安全性的设计,其核心思想是将不同的功能模块分配到独立的进程中运行。这种架构通过隔离渲染、网络、GPU 等任务来避免单一进程崩溃影响整个浏览器[^3]。 #### 进程分类 Chromium 主要包含以下几类进程- **Browser 进程**:负责管理用户界面、网络请求、磁盘 I/O 等全局性操作。 - **Render 进程**:负责解析 HTML、CSS 并渲染页面内容,每个标签页通常对应一个 Render 进程- **GPU 进程**:处理与图形加速相关的任务,例如合成和光栅化。 - **Plugin 进程**:用于运行第三方插件(如 Flash),以确保其不稳定性不会直接影响主流程[^3]。 #### 进程间通信机制 (IPC) 各进程之间通过 Chromium 自定义的 IPC 机制进行通信。IPC 采用消息传递模型,支持同步和异步通信方式。具体实现中,每个进程都有自己的 IPC 通道,通过这些通道交换数据并协调操作。例如,Browser 进程通过 IPC 向 Render 进程发送导航指令,并接收页面加载完成的通知[^1]。 #### 渲染进程共享行为 在某些场景下,多个标签页可能需要共享同一个 Render 进程,这可以通过命令行参数 `--process-per-site` 或 `--process-per-tab` 来控制。前者按照网站域名划分进程,后者则为每个标签页创建独立的 Render 进程。此机制允许灵活地平衡资源消耗和隔离级别[^1]。 #### 安全与沙箱化 Chromium 对 Render 进程实施了沙箱保护,限制其对系统资源的访问权限。例如,Render 进程无法直接访问文件系统或执行任意代码。此外,Browser 进程会监控 Render 进程的状态,在检测到异常时自动重启受影响的进程,从而提升整体稳定性[^2]。 #### 内存回收与崩溃恢复 当某个 Render 进程崩溃时,Browser 进程能够检测到这一事件并通过重新启动新的 Render 进程来恢复页面状态。同时,Chromium 采用了高效的内存回收策略,以减少长期运行导致的内存泄漏问题。 #### 示例代码:WaitableEvent 类 WaitableEvent 是 Chromium 中用于线程同步的一个重要类,它提供了一种等待某个事件发生的机制。以下是其构造函数的简化实现: ```cpp WaitableEvent::WaitableEvent(bool manual_reset, bool initially_signaled) : kernel_(new WaitableEventKernel(manual_reset, initially_signaled)) { } ``` 该函数定义在文件 `external/chromium_org/base/synchronization/waitable_event_posix.cc` 中,用于创建一个可手动重置或自动重置的事件对象[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值