chromium Multi-process Architecture

本文介绍了Chromium浏览器的多进程架构设计,通过将标签页内容置于独立进程中运行以提高稳定性和安全性。文章详细阐述了BrowserProcess与RenderProcess之间的通信机制,以及如何管理和检测渲染进程的状态。
原文链接:
http://www.chromium.org/developers/design-documents/multi-process-architecture
本文档描述了Chromium的上层架构。
问题
创建一个从不崩溃或宕机的渲染引擎几乎是不可能的。
创建一个具有完美安全性的渲染引擎也几乎是不可能的。
从某些方面讲,浏览器的现状像是过去的单用户,多任务的操作系统。
在这样的操作系统中,一个行为不慎的应用程序可以导致整个操作系统无法工作,
同样的,一个行为不慎的网页也可以导致整个现代浏览器无法工作。
一个浏览器或插件bug可以让一个行为不慎的网页使整个浏览器和当前处于运行状态的所有标签页崩溃。
现代操作系统更健壮,因为现代操作系统将应用程序放在彼此隔离的单独进程中。
一个应用程序的崩溃通常不会影响其他应用程序或者整个操作系统,每个进程对其他进程数据的访问是受限制的。

架构概述
我们使用单独的进程来运行浏览器标签页,以此来阻止渲染引擎的bug和故障对整个应用程序的影响。
我们也限制渲染引擎进程对其他渲染引擎进程和系统其余部分的访问。
从某些方面讲,这种策略给浏览器带来的好处和内存保护和访问控制给操作系统带来的好处是一样的。
我们称运行UI,管理标签页和插件进程的主进程为"browser process" or "browser."
类似的,我们称运行各个单独标签页的进程为 "render processes" or "renderers."
renderers 进程使用 WebKit开源布局引擎来解析和布局HTML页面.


管理render进程
每个render进程都有一个全局的RenderProcess对象,这个对象管理render进程和browser父进程的通信,
并维护render进程的全局状态。
browser进程为每一个render进程维护一个与RenderProcess对应的RenderProcessHost对象,
RenderProcessHost对象负责管理browser进程状态,并与render进程通信。
browser进程和render进程使用Chromium的IPC系统进行通信。

管理views
每个render进程有一个或多个RenderView 对象,这些RenderView由RenderProcess管理,
对应着标签页的内容。与RenderProcess对应的RenderProcessHost维护着
RenderViewHost,RenderViewHost与render进程中的RenderView对象对应。
每个view 都有一个view ID,用来区分同一个renderer中的多个view.
这些view ID 在同一个render进程中是唯一的,但是在browser进程中不是唯一的,
所以标识一个view需要一个RenderProcessHost和一个View ID.
browser进程和某个tab 内容的通信就是通过这些RenderViewHost对象完成的。
RenderViewHost对象知道怎样通过它所关联的RenderProcessHost发消息给RenderProcess,
进而把消息传给RenderView.

组件和接口
render进程中:
RenderProcess负责处理与browser进程中对应的RenderProcessHost之间的IPC。   
每个render进程有且只有一个RenderProcess对象。 所有的browser ↔ renderer进程间通信都是这样发生的。
RenderView对象通过RenderProcess对象与它在browser进程中对应的RenderViewHost对象通信。
RenderView对象也与我们的WebKit内嵌层通信。
RenderView对象代表标签页或弹出窗口中显示的网页内容。
browser 进程中:
browser对象代表顶层浏览器窗口。
RenderProcessHost对象代表一个browser ↔ renderer IPC 连接中的browser端.
每个render进程都对应着browser进程中的一个RenderProcessHost对象。
RenderViewHost 对象封装了与远端RenderView的通信。
RenderWidgetHost负责在browser进程中处理RenderWidget的输入和绘制。
关于这种嵌入方式的工作细节,参见How Chromium displays web pages design document.

共享render进程
通常,每个新的窗口和标签页都会在一个新的进程中打开。
browser孵化一个新的进程,并指示新的进程创建一个RenderView.
有时,在不同的标签页或窗口间共享一个render进程是必要的,或者更理想的。
一个web应用打开一个期望同步通信的新窗口,比如,使用JavaScript接口window.open.
在这种情况下,当我们创建一个新的窗口或标签时,我们需要重用打开这个窗口的进程。
当进程总数太多,或者用户已经有一个进程在运行要打开的标签时,
我们也有策略可以将标签赋给一个已经存在的进程。这些策略在进程模型从有详细的描述。

检测崩溃或有异常行为的render
每一个与browser进程建立了连接的IPC connection都监视着render进程句柄.
如果这些句柄收到信号,说明render进程崩溃了,标签页会收到崩溃通知。
目前为止,我们显示一个"sad tab"屏幕通知用户render进程崩溃了。
如果按reload按钮或者重新导航到这个页面,网页会被重新加载。
当网页被重新加载时,我们注意到没有进程在运行需加载的网页,我们创建一个新的进程。

Sandboxing the renderer
由于Webkit运行在一个单独的进程中,我们有机会限制它对系统资源的访问。
例如:我们可以确保render进程只能通过它的browser父进程访问网络。
同样的,我们可以限制render进程只能使用宿主操作系统内置的权限访问文件系统。
除了可以限制render进程访问文件系统和网络外,
我们还可以限制render进程对用户显示以及显示相关对象的访问。
我们在一个单独的用户不可见的窗口“桌面”中运行render.
这可以阻止一个受损的render打开一个新的窗口或者扑捉键值。

Giving back memory
由于render运行在单独的进程中,所以认为隐藏的标签页具有较低的优先级是很自然的。
通常来讲,窗口中最小化的进程会自动将它们占用的内存放回“可用内存”池中。
在内存不足的情况下,窗口在换出具有较高优先级的内存前,会先把这部分内存换出到硬盘,
以保持用户可见的应用程序具有更好的交互性。
我们可以对隐藏标签使用同样的策略。
当一个render进程没有顶层标签时,我们可以释放这个render进程的 “工作区间”,
以此暗示操作系统可以在需要的时候优先将这个render进程的"工作区间"内存换出到硬盘上。
因为我们发现,减少工作区间的大小会影响用户在两个标签页之间切换的性能。
所以我们逐渐的释放"工作空间"内存。
这意外着如果用户切换会最近使用过的标签页,这个标签页的数据很可能是通过换页机制重新加载进内存的。
有足够内存运行他们的程序的用户完全不会注意到这个进程:
窗口只在需要的时候实际回收这些数据,所以当有足够内存时,不会影响性能。
这帮助我们在内存不足的情况下,优化内存占用。
很少使用的后台标签页占用的内存可以全部换出,以便前台标签页的数据可以全部加载到内存中。
相反的,在只有一个进程的浏览器中,所有标签页的数据随机分布在内存中,
不可能将使用的数据和不使用的数据如此清晰的隔离开,即浪费内存又浪费性能。
插件
Firefox类型的NPAPI插件运行在他们自己的进程中,与render进程相独立。关于这部分更详细的描述参见Plugin Architecture.







传送带损坏与对象检测数据集 一、基础信息 • 数据集名称:传送带损坏与对象检测数据集 • 图片数量: 训练集:645张图片 验证集:185张图片 测试集:92张图片 总计:922张工业监控图片 • 训练集:645张图片 • 验证集:185张图片 • 测试集:92张图片 • 总计:922张工业监控图片 • 分类类别: Hole(孔洞):传送带表面的孔洞损坏。 Human(人类):工作区域中的人类,用于安全监控。 Other Objects(其他对象):非预期对象,可能引起故障。 Puncture(刺穿):传送带被刺穿的损坏。 Roller(滚筒):传送带滚筒部件。 Tear(撕裂):传送带撕裂损坏。 impact damage(冲击损坏):由于冲击导致的损坏。 patch work(修补工作):已修补的区域。 • Hole(孔洞):传送带表面的孔洞损坏。 • Human(人类):工作区域中的人类,用于安全监控。 • Other Objects(其他对象):非预期对象,可能引起故障。 • Puncture(刺穿):传送带被刺穿的损坏。 • Roller(滚筒):传送带滚筒部件。 • Tear(撕裂):传送带撕裂损坏。 • impact damage(冲击损坏):由于冲击导致的损坏。 • patch work(修补工作):已修补的区域。 • 标注格式:YOLO格式,包含边界框和类别标签,适用于目标检测任务。 • 数据格式:图像数据来源于工业监控系统,适用于计算机视觉分析。 二、适用场景 • 工业自动化检测系统开发:用于构建自动检测传送带损坏和异物的AI模型,实现实时监控和预防性维护,减少停机时间。 • 安全监控应用:识别人类和其他对象,提升工业环境的安全性,避免事故和人员伤害。 • 学术研究与创新:支持计算机视觉在制造业、物流和自动化领域的应用研究,促进AI技术与工业实践的融合。 • 教育与培训:可用于培训AI模型或作为工业工程和自动化教育的案例数据,帮助学习者理解实际应用场景。 三、数据集优势 • 多样化的类别覆盖:包含8个关键类别,涵盖多种损坏类型和对象,确保模型能够处理各种实际工业场景,提升泛化能力。 • 精准的标注质量:采用YOLO格式,边界框标注准确,由专业标注人员完成,保证数据可靠性和模型训练效果。 • 强大的任务适配性:兼容主流深度学习框架(如YOLO、TensorFlow、PyTorch),可直接用于目标检测任务,并支持扩展至其他视觉任务需求。 • 突出的工业价值:专注于工业传送带系统的实际需求,帮助提升生产效率、降低维护成本,并增强工作场所安全,具有较高的实际应用价值。
一、基础信息 • 数据集名称:垃圾废弃物目标检测数据集 • 图片数量: 训练集:1124张图片 验证集:375张图片 总计:1499张图片 • 训练集:1124张图片 • 验证集:375张图片 • 总计:1499张图片 • 分类类别:包含60多个垃圾和废弃物类别,如气溶胶、铝泡罩包装、电池、破碎玻璃、卡片泡罩包装、香烟、透明塑料瓶、瓦楞纸箱、薯片袋、一次性食品容器、一次性塑料杯、饮料罐、饮料纸盒、鸡蛋盒、泡沫杯、泡沫食品容器、食品罐、食物垃圾、垃圾袋、玻璃瓶、玻璃杯、玻璃罐、杂志纸、餐盒、金属瓶盖、金属盖、普通纸、其他纸箱、其他塑料、其他塑料瓶、其他塑料容器、其他塑料杯、其他塑料包装、纸袋、纸杯、纸吸管、披萨盒、塑料瓶盖、塑料薄膜、塑料手套、塑料盖、塑料吸管、塑料餐具、聚丙烯袋、拉环、绳子、废金属、鞋子、一次性购物袋、六罐环、涂抹管、可挤压管、泡沫塑料片、纸巾、厕纸管、特百惠、未标记垃圾、包装纸等。 • 标注格式:YOLO格式,包含边界框和类别标签,适用于目标检测任务。 • 数据格式:图片来源于实际场景,细节清晰。 二、适用场景 • 垃圾自动分类系统开发:数据集支持目标检测任务,帮助构建能够自动识别和分类垃圾物品的AI模型,用于智能垃圾桶或回收系统,提升废弃物管理效率。 • 环保应用研发:集成至环保和废弃物管理应用,提供实时垃圾识别功能,促进回收和环境保护,支持可持续发展倡议。 • 学术研究与创新:支持计算机视觉与环保领域的交叉研究,助力发表垃圾识别和AI技术相关学术论文,推动技术创新。 • 教育与培训:可用于学校或培训机构,作为垃圾分类和AI目标检测教学的重要资源,培养环保意识和技术能力。 三、数据集优势 • 精准标注与多样性:每张图片经过准确标注,确保边界框定位精确;包含多种垃圾类别,覆盖常见废弃物,提升模型的泛化能力和鲁棒性。 • 任务适配性强:标注兼容主流深度学习框架(如YOLO等),可直接用于目标检测任务,并支持扩展到其他视觉任务,如分类或分割。 • 实际应用价值:专注于垃圾识别,为环保、废弃物管理和回收提供重要数据支撑,有助于减少污染和促进循环经济。
水下垃圾实例分割数据集 一、基础信息 • 数据集名称:水下垃圾实例分割数据集 • 图片数量: 训练集:1049张图片 验证集:300张图片 测试集:150张图片 总计:1499张图片 • 训练集:1049张图片 • 验证集:300张图片 • 测试集:150张图片 • 总计:1499张图片 • 分类类别: Aerosol(气溶胶罐) Aluminium blister pack(铝泡罩包装) Aluminium foil(铝箔) Battery(电池) Broken glass(碎玻璃) Carded blister pack(卡式泡罩包装) Cigarette(香烟) Clear plastic bottle(透明塑料瓶) Corrugated carton(瓦楞纸箱) Crisp packet(薯片袋) Disposable food container(一次性食品容器) Disposable plastic cup(一次性塑料杯) Drink can(饮料罐) Drink carton(饮料纸盒) Egg carton(鸡蛋盒) Foam cup(泡沫杯) Foam food container(泡沫食品容器) Food Can(食品罐) Food waste(食物垃圾) Garbage bag(垃圾袋) Glass bottle(玻璃瓶) Glass cup(玻璃杯) Glass jar(玻璃罐) Magazine paper(杂志纸) Meal carton(餐盒) Metal bottle cap(金属瓶盖) Metal lid(金属盖子) Normal paper(普通纸) Other carton(其他纸盒) Other plastic(其他塑料) Other plastic bottle(其他塑料瓶) Other plastic container(其他塑料容器) Other plastic cup(其他塑料杯) Other plastic wrapper(其他塑料包装) Paper bag(纸袋) Paper cup(纸杯) Paper straw(纸吸管) Pizza box(披萨盒) Plastic bottle cap(塑料瓶盖) Plastic film(塑料薄膜) Plastic gloves(塑料手套) Plastic lid(塑料盖子) Plastic straw(塑料吸管) Plastic utensils(塑料餐具) Polypropylene bag(聚丙烯袋) Pop tab(易拉罐拉环) Rope - strings(绳子-字符串) Scrap metal(废金属) Shoe(鞋子) Single-use carrier bag(一次性购物袋) Six pack rings(六罐环) Spread tub(涂抹桶) Squeezable tube(可挤压管) Styrofoam piece(泡沫塑料片) Tissues(纸巾) Toilet tube(卫生纸卷) Tupperware(特百惠) Unlabeled litter(未标记垃圾) Wrapping paper(包装纸) • Aerosol(气溶胶罐) • Aluminium blister pack(铝泡罩包装) • Aluminium foil(铝箔) • Battery(电池) • Broken glass(碎玻璃) • Carded blister pack(卡式泡罩包装) • Cigarette(香烟) • Clear plastic bottle(透明塑料瓶) • Corrugated carton(瓦楞纸箱) • Crisp packet(薯片袋) • Disposable food container(一次性食品容器) • Disposable plastic cup(一次性塑料杯) • Drink can(饮料罐) • Drink carton(饮料纸盒) • Egg carton(鸡蛋盒) • Foam cup(泡沫杯) • Foam food container(泡沫食品容器) • Food Can(食品罐) • Food waste(食物垃圾) • Garbage bag(垃圾袋) • Glass bottle(玻璃瓶) • Glass cup(玻璃杯) • Glass jar(玻璃罐) • Magazine paper(杂志纸) • Meal carton(餐盒) • Metal bottle cap(金属瓶盖) • Metal lid(金属盖子) • Normal paper(普通纸) • Other carton(其他纸盒) • Other plastic(其他塑料) • Other pl
在使用 `sudo chromium --no-sandbox` 启动 Chromium 时,窗口出现透明和频闪问题,通常是由于系统图形渲染机制与 Chromium 的启动参数之间的兼容性问题所导致。以下是一些可行的解决方案: ### 1. 调整窗口管理器设置 在某些轻量级桌面环境(如树莓派的 Raspbian)中,默认的窗口管理器(如 Matchbox)可能会与 Chromium 的无沙箱模式产生渲染冲突。可以通过显式启动一个更稳定的窗口管理器(如 Openbox)来解决此问题: ```bash openbox & chromium-browser --no-sandbox --start-fullscreen ``` ### 2. 禁用 GPU 加速 Chromium 的 GPU 加速功能在某些硬件或驱动环境下可能导致窗口渲染异常。可以通过添加 `--disable-gpu` 参数来禁用 GPU 渲染: ```bash chromium-browser --no-sandbox --disable-gpu ``` ### 3. 强制启用软件渲染 如果禁用 GPU 后仍存在问题,可以尝试启用软件渲染后端,以绕过硬件加速: ```bash chromium-browser --no-sandbox --disable-gpu --enable-software-rendering ``` ### 4. 使用无头模式结合虚拟显示 对于不需要实际显示图形界面的场景(如自动化测试),可以结合 Xvfb(虚拟 X 服务器)运行无头模式的 Chromium: ```bash sudo apt install xvfb Xvfb :99 -screen 0 1024x768x24 & DISPLAY=:99 chromium-browser --no-sandbox --headless --disable-gpu ``` ### 5. 更新系统与浏览器版本 确保系统和 Chromium 版本均为最新。旧版本的 Chromium 或系统图形库可能存在已知的渲染问题,更新后可能已修复[^4]。 ### 6. 修改启动脚本以避免冲突参数 在某些情况下,系统可能通过桌面文件(desktop file)预设了一些冲突的启动参数。可以手动复制并修改 `/usr/share/applications/chromium.desktop` 文件,确保没有不必要的图形相关参数冲突[^4]。 ### 7. 调整桌面环境配置 如果使用的是树莓派或其他嵌入式设备,尝试切换到不同的桌面环境(如 XFCE 或 LXDE)以获得更稳定的图形支持。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值