当前位置: 首页 > article >正文

零 unsafe 代码!Rust 垃圾回收库 safe - gc 实现无安全隐患回收

无需不安全代码的垃圾回收2024 年 2 月 6 日包括作者在内的很多人都为 Rust 实现了垃圾回收Garbage CollectionGC库。几年前Manish Goregaokar 撰写了一篇精彩的综述介绍了这一领域。这些库旨在为用户提供安全的 API即一个无 unsafe 的接口能妥善封装并隐藏库内部的 unsafe 代码。不过枚举用户定义的 GC 类型的外向 GC 边的机制是个例外。因为若未能枚举所有边可能导致悬空指针use - after - free错误。通常这个功能会以 unsafe 特性trait的形式暴露给用户实现毕竟维护这一关键安全不变性是用户的责任而非库的责任。然而尽管这些库提供了安全的接口但它们在内部实现中都大量使用了 unsafe 代码。作者一直认为可以编写一个完全不使用 unsafe 代码的垃圾回收库而且和别人这么说时也没人反对但一直没有实际的实现来证明。最终作者创建了 safe - gc 库一个零 unsafe 代码的 Rust 垃圾回收库。不仅 API 中没有 unsafe实现中也没有甚至在代码顶部还有 forbid(unsafe_code) 编译指示。不过safe - gc 并不是一个高性能的垃圾回收器。使用 safe - gc要使用 safe - gc首先要定义由 GC 管理的类型使用 Gc 来定义对其他 GC 管理对象的引用并实现 Trace 特性将这些 GC 边报告给收集器。这看起来和其他 Rust 的 GC 库很相似不过如果能为 Option 实现 Trace 特性再加上一个 derive(Trace) 宏就更好了。与现有 GC 库的最大区别在于Trace 实现起来是安全的。接下来创建一个或多个 Heap 来分配对象。每个堆都会独立进行垃圾回收。有了 Heap 后就可以分配对象了。堆会在必要时自动触发垃圾回收也可以手动强制进行回收。不能直接解引用 Gc 指针而必须通过索引 Heap 来访问引用的 T 对象。这与其他 GC 库不同也是 safe - gc 无需 unsafe 代码的关键这样的实现能遵循 Rust 的所有权和借用规则。实际上有两种类型可以用来索引 Heap 以访问 GC 对象一是 Gc它是可复制Copy的当在 GC 管理对象的类型定义中引用其他 GC 管理对象或者能证明不会发生垃圾回收即对其堆有共享借用时使用但它不会将其引用的 T 固定root无法保证对象在垃圾回收中存活因此在可能触发垃圾回收的操作中不应使用 Gc 来持有 GC 引用二是 Root它会固定其关联的 T 对象防止对象在垃圾回收中被回收适合在可能触发垃圾回收的操作中持有对 GC 管理对象的引用且不可复制因为丢弃它时必须从堆的根集root set中移除其条目分配操作返回的是固定引用。深入探究safe_gc::Heap 更像是基于 Vec 的竞技场新类型arena newtype而不是像 Immix 那样具有区域层次结构的工程化堆。它的主要存储是一个从 std::any::TypeId 到关联类型的统一竞技场arena的哈希映射。这让我们最终可以使用 Vec 作为堆分配对象的存储无需进行任何不安全的指针运算也不用担心在空闲列表中分割大块内存。实际上空闲列表只管理索引而非原始内存块。要在堆中分配一个新的 T首先从堆的哈希映射中获取 T 对象的竞技场如果不存在则创建。然后检查竞技场是否有足够的容量来分配新的 T。如果有将对象添加到竞技场并返回一个固定引用如果没有则采用较慢的路径触发垃圾回收以确保有空间分配新对象然后再次尝试。Arena 的分配最终依赖于 FreeList 的分配它会尽可能使用内部的空闲条目列表来利用现有容量否则会保留额外的容量。访问堆中的对象很简单查找 T 的竞技场并进行索引。在了解 safe - gc 如何进行垃圾回收之前需要先看看它如何实现根集。根集是那些肯定存活的对象集合即应用程序当前正在使用或计划在未来使用的对象。收集器的目标是识别所有从这些根对象可传递引用的对象而回收其他所有对象。每个 Arena 都有自己的 RootSet。为简单起见RootSet 是 FreeList 的包装器。添加新的根对象时将其插入 FreeList丢弃根对象时将其从 FreeList 中移除。这意味着根集可能包含重复项因此不是一个真正的集合。根集的 FreeList 还被包装在 Rc 中这样就可以为 Root 实现 Clone在根集中添加另一个条目并且无需显式传递 Heap 来持有对固定对象的额外引用。最后作者精心设计了 Root 和 RootSet使 Root 不直接持有 Gc。这样可以在回收后更新固定的 GC 指针这对于像分代 GC 和内存整理compaction这样的移动 GC 算法是必要的。实际上作者最初打算为 safe - gc 实现一个复制收集器copying collector这是一种移动 GC 算法但遇到了一些问题。目前保留了在未来引入移动 GC 的可能性。了解了这些之后就可以看看核心的垃圾回收算法了。safe - gc 实现了简单的标记 - 清除mark - and - sweep垃圾回收算法。首先重置每个竞技场的标记位并确保有足够的位来标记所有已分配的对象因为将标记位存储在一个独立的紧凑位集中而不是每个对象的头部字中。接下来进入标记阶段。从遍历每个根对象开始设置其标记位并通过调用 collector.edge(root) 将其加入标记栈。标记阶段会在一个定点循环中继续标记从这些根对象可传递到达的所有对象。如果发现一个未标记的对象就标记它并将其加入追踪队列如果遇到已经标记的对象则忽略它。不同寻常的是没有一个统一的标记栈。Heap 没有 T 类型参数包含多种不同类型的对象所以堆本身不知道如何追踪任何特定的对象。然而堆中的每个 Arena 只包含一种类型的对象并且竞技场知道如何追踪其对象。因此为每个 T即每个竞技场都有一个标记栈。这意味着定点循环有两层外层循环在任何标记栈有工作时继续执行内层循环用于清空特定的标记栈。虽然标记的驱动循环在 Heap::gc 方法中但实际的边追踪和标记位设置发生在 Collector 和竞技场中因为竞技场有 T 类型参数可以为每个对象调用正确的 Trace 实现。那么safe - gc 在实际应用中的表现究竟如何呢

相关文章:

零 unsafe 代码!Rust 垃圾回收库 safe - gc 实现无安全隐患回收

无需不安全代码的垃圾回收2024 年 2 月 6 日,包括作者在内的很多人都为 Rust 实现了垃圾回收(Garbage Collection,GC)库。几年前,Manish Goregaokar 撰写了一篇精彩的综述,介绍了这一领域。这些库旨在为用户…...

别只懂按Q!深度挖掘Cubase量化设置:量化预置、长度量化与网格显示的隐藏关系

别只懂按Q!深度挖掘Cubase量化设置:量化预置、长度量化与网格显示的隐藏关系 在数字音频工作站的世界里,量化功能就像一位隐形的节奏矫正师。许多制作人习惯性地按下Q键就期待完美对齐,却常常发现结果不尽如人意——三连音变成了规…...

UEFI电源管理探秘:从S3睡眠到唤醒的完整旅程

1. 电源管理基础:SX与GX状态解析 现代计算机的电源管理远比我们想象的复杂。想象一下你的笔记本电脑合上盖子时发生了什么——屏幕熄灭、风扇停转,但内存中的数据依然保持。这就是S3睡眠状态的典型应用场景。电源管理状态主要分为SX(Sleep St…...

高效使用 JMeter 生成随机数:探索 Random 和 UUID 算法

在压力测试中,经常需要生成随机值来模拟用户行为。JMeter 提供了多种方式来生成随机值,本文来具体介绍一下。 随机数函数 JMeter 提供了多个用于生成随机数的函数,其中最常用的是__Random函数。该函数可以生成一个指定范围内的随机整数或浮…...

别再傻傻手动旋转了!用Blender父子约束5分钟搞定产品360°展示动画

用Blender父子约束5分钟打造专业级产品展示动画 在电商视觉设计和产品展示领域,一个流畅的360度旋转动画往往比静态图片更能吸引用户注意。传统手动逐帧调整的动画制作方式不仅耗时费力,而且难以保证旋转的精确性和流畅度。Blender的父子约束功能正是解决…...

LeetCode热题100-在排序数组中查找元素的第一个和最后一个位置

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。思路:找左边…...

Python缺失值可视化分析实战:以Ames房价数据为例

1. 项目概述:缺失值可视化分析的价值在数据分析领域,缺失值就像隐藏在数据集中的隐形陷阱,稍不注意就会导致模型偏差或结论错误。Ames Housing数据集作为房价预测领域的经典数据集,包含80个特征变量和2930条房产记录,其…...

2025届最火的十大降AI率平台推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 随着人工智能生成内容越来越普及,各种各样的AI检测系统出现了。为了保证文本能通…...

人体活动识别技术:算法评估与工程实践

1. 项目背景与核心挑战人体活动识别(Human Activity Recognition, HAR)是机器学习在可穿戴设备和智能感知领域的重要应用场景。我们经常需要从加速度计、陀螺仪等传感器数据中自动识别行走、跑步、坐卧等日常活动。这个任务看似简单,但在实际…...

Nano Banana 配图提示词完全指南(CSDN适配版)——精准出图,提示词撰写\+优化全攻略

🔥 Nano Banana 配图提示词完全指南(CSDN适配版)——精准出图,提示词撰写优化全攻略 核心看点:Nano Banana 作为轻量高效的AI配图工具,凭借简洁操作、高适配性,成为CSDN博主、设计师、开发者的配…...

别再乱用GFP_KERNEL了!Linux内核alloc_pages内存分配标志保姆级避坑指南

Linux内核内存分配标志深度解析:从原理到实战避坑指南 在Linux内核开发中,内存分配是最基础也最容易被低估的技术细节之一。许多开发者在使用alloc_pages这类底层接口时,往往只关注了内存大小参数,却忽略了gfp_mask标志的选择——…...

pytest + yaml 框架 - Pycharm 设置 yaml 格式用例模板,高效写用例

初学者对yaml 格式不太熟悉,自己写yaml用例的时候,总是格式对不齐,或者有些关键字会忘记。 于是我们可以在pycharm上设置用例模块,通过快捷方式调用出对应的模块,达到高效写用例的目的。 pycharm设置用例模板 File …...

CSS如何实现文本溢出显示省略号_掌握text-overflow使用方法

...

Playwright实战-在gitlab ci环境运行自动化测试

简介:CI/CD持续集成和持续部署是确保代码质量和快速交付的关键步骤。本文详细介绍了如何在GitLab CI环境中配置和运行Playwright测试。 1. 前置条件 开始之前,请确保满足以下前提条件: • Playwright测试可以在本地环境中运行正常 • Gitla…...

永磁同步电机智能控制技术:模糊逻辑与神经网络应用

1. 永磁同步电机智能控制技术演进永磁同步电机(PMSM)作为现代工业驱动系统的核心部件,其控制性能直接影响着电动汽车、工业机器人等高精度应用场景的能效表现。传统PID控制在面对参数变化和外部扰动时表现出的局限性,促使研究者将目光转向更具鲁棒性的控…...

量子纠错码逻辑噪声模型与表面码优化实践

1. 量子纠错码逻辑噪声模型的理论框架量子纠错码(QEC)的核心目标是通过冗余编码保护量子信息免受环境噪声的影响。在表面码实现中,逻辑量子比特的状态通过二维晶格上物理比特的纠缠态来编码。理解逻辑层面的噪声特性对于评估纠错性能至关重要…...

BilibiliDown:跨平台B站视频下载的终极指南,轻松收藏您喜爱的内容

BilibiliDown:跨平台B站视频下载的终极指南,轻松收藏您喜爱的内容 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gi…...

从 Redis 到 Kafka:一篇讲透消息队列与数据存储的选型之道

缓存、消息代理、流存储……同一个 Redis,为什么能扮演这么多角色? 当你需要“磁盘长期存储”时,Kafka 和 RabbitMQ 谁才是正解? 一、Redis 到底是一个什么样的系统? 最常见的定义是:Redis 是一个开源的、基于内存的键值存储系统。 但这只描述了它的物理基础(数据在内存…...

Rust 生命周期与内存管理实践

Rust 生命周期与内存管理实践 Rust 作为一门系统级编程语言,凭借其独特的所有权系统和生命周期机制,在内存安全和性能之间取得了卓越的平衡。对于开发者而言,理解生命周期与内存管理的实践是掌握 Rust 的关键。本文将深入探讨 Rust 生命周期…...

别再傻傻分不清!一文速查主流芯片公司Logo与官网(附高清图标PDF下载)

芯片品牌视觉指南:从Logo识别到高效信息管理实战手册 在电子元器件领域,一个看似简单的芯片Logo背后可能代表着截然不同的技术路线和产品生态。当工程师在电路板上发现一个陌生的商标,采购专员需要快速核实供应商资质,或是电子爱…...

DRC Debugger实战:Pin Data Type详解与TetraMAX SWV波形调试指南

DRC Debugger实战:Pin Data Type详解与TetraMAX SWV波形调试指南 在芯片测试领域,DRC(Design Rule Check)违规分析是确保设计可测试性的关键环节。当Design Vision中密密麻麻的违规报告扑面而来时,中高级DFT工程师需要…...

DPI-每英寸点数

DPI(Dots Per Inch,每英寸点数)是一个量度单位,表示在每英寸长度上可以打印或显示的点数,这些点可以是墨点、像素或其他形式的显示元素。 DPI(每英寸点数)是衡量图像打印或显示质量的一个重要参…...

如何减小音频文件体积?盘点5个MP3压缩瘦身方法!

手机存了几首无损音乐,内存就告急?录制好的音频文件太大,无法通过微信或邮件发送?想把喜欢的歌曲设置成铃声,却发现体积超标?这些场景,相信很多朋友都遇到过。MP3文件虽然常见,但高品…...

学工平台让学生请假告别繁琐,移动审批随时处理

✅作者简介:合肥自友科技 📌核心产品:智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…...

PDF转长图终极指南:三种方法,轻松将多页文档变为一张吸睛长图

你是否遇到过这样的场景:想在社交平台分享一份PDF里的精彩内容,但平台不支持文件格式?或者,你想将一份产品说明、课程讲义或个人简历制作成一张可以在手机上顺畅滑动浏览的长图,以获得更好的阅读体验?将多页…...

怎样全面评估智慧校园平台的性价比?这几点值得参考

✅作者简介:合肥自友科技 📌核心产品:智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…...

Agent智能体开发秘籍:从Prompt工程到自主决策的4阶段进阶路线!

本文为开发者提供了Agent智能体开发的4阶段进阶路线:首先通过Prompt工程与思维链让LLM学会思考;其次掌握Function Calling与工具调用能力,赋予LLM“手脚”;接着利用RAG增强与长期记忆机制解决知识截止与上下文限制问题&#xff1b…...

TRAE如何节省token额度教程(一)|理解Token与上下文窗口 token消耗快怎么办?

TRAE如何节省token额度教程(一)|理解Token与上下文窗口 token消耗快怎么办? 关键词: TRAE省钱、Token是什么、上下文窗口是什么、AI计费原理、AI Coding成本、Agent为什么费Token、如何降低AI成本前段时间我在用 TRAE 做 AI Coding 的时候,发…...

向量搜索误召回率高达38%?EF Core 10中Normalize预处理缺失、余弦阈值漂移、HNSW参数过拟合三重危机预警

第一章:EF Core 10向量搜索扩展的危机本质与演进定位向量搜索在ORM生态中的结构性张力 EF Core 10首次将向量搜索能力纳入官方实验性扩展(Microsoft.EntityFrameworkCore.Vector),但其设计并未突破传统ORM“关系—对象”映射范式的…...

WebRPA教程:零代码实现浏览器网页自动化、爬虫与桌面自动化神器 打造自己的AI浏览器!轻松实现浏览器自动点击 自动处理数据 网络抓包 表格数据提取等复杂功能

WebRPA教程:零代码实现浏览器网页自动化、爬虫与桌面自动化神器 打造自己的AI浏览器!轻松实现浏览器自动点击 自动处理数据 网络抓包 表格数据提取等复杂功能 关键词: WebRPA下载、RPA自动化工具、网页自动化工具、RPA流程自动化、可视化爬虫工具、Wind…...