QCon 全球软件开发大会(北京站)门票 9 折倒计时 4 天,点击立减 ¥880 了解详情
写点什么

“雪花”项目:Microsoft 探索在.NET 中实现手工内存管理

2017 年 9 月 04 日

来自 Microsoft 研究院、剑桥大学和普林斯顿大学的一些研究人员构建了一个.NET 的分支,实现了在运行时中添加支持手工内存管理的 API。研究方法的细节及所获得的性能提升发表在名为“ Project Snowflake: Non-blocking Safe Manual Memory Management in .NET ”(“雪花”项目:非阻塞的、安全的.NET 手工内存管理)的论文中。

“雪花“项目意在实现.NET 中的手工内存管理,这一改进被认为对一些应用是非常有用。C#、.NET 等现代编程语言都采用了垃圾回收机制,使编程人员得以从管理对象的任务中解放出来,这一机制的优点广为人知,涉及提高生产力、改进程序稳定性、内存安全及防止恶意操作等方面。但是垃圾回收机制需要付出一些性能上的代价,尽管这在很多情况下不易被察觉,但是在一些情况下还是存在问题的。“雪花”项目的研究人员就指出,对于在具有上百 GB 堆内存的系统上运行数据分析和流处理任务,就可受益于手工内存管理。

“雪花”项目所引入的手工内存管理是与垃圾回收机制并行工作的,开发人员一般情况下使用的是垃圾回收机制,但在环境需要时也可以选择手工内存管理。该引入到运行时中的改进并不会对已有应用产生影响,并且会改进多线程应用的性能。“雪花”项目实现了“在程序任一位置分配和释放独立对象,并确保手工管理对象同样享有完全的类型安全和时序安全,即使存在并发访问时。”

“雪花”中提出了两个新概念,即对象“所有者”(Owner)和“护盾”(Shield),它们实现为 CoreCLR 和 CoreFX 层级的 API。“所有者”表示了栈或堆中的一个位置,保存了对手工堆中分配对象的唯一引用。“所有者”获取自“护盾”,而引入“护盾”是为了避免手工对象在被多个线程访问时重分配(deallocate)。“护盾”确保了当最后使用一个对象的线程重分配该对象后,才从堆中移除该对象。论文中是如下详细阐述该机制的:

我们的解决方案……受到了无锁数据结构研究中的“风险指针”(Hazard Pointer)这一概念的启发。我们引入了一种机制,当线程想要通过其中一个“所有者”位置访问手工对象时,这一意图将会发布在线程本地状态(TLS,Thread-Local State)中。此注册过程可看成是创建了一个“护盾”,该“护盾”将保护对象不会被重分配,并授权发布注册的线程可直接访问对象,例如调用对象的方法,或是转换(mutate)对象的字段。同时,不允许任何线程(同一线程或另一个线程)重分配对象及回收(reclaim)对象的内存。一旦客户代码不再需要访问该对象,就可以释放(dispose)“护盾”,即从对象的 TLS 中移除了指向该对象的引用。直接访问从“护盾”获取的对象是不安全的操作,因为在释放“护盾”后,实际的重分配操作依然允许继续。

论文中提供了一系列给定场景下的测试结果,表明使用“雪花”项目的性能相比于垃圾回收机制取得了改进。其中,“在峰值工作集上获得了高达三倍的性能提高,在运行时上取得了两倍的性能提高”。测试结果给出了很好的性能改进。这是因为当对象池非常大时,垃圾回收为释放内存需要花费很多时间遍历对象图。

Microsoft 并未详述是否有规划在.NET 中加入“雪花”项目。但考虑到这是一种非侵入式的和安全的机制,我们希望在.NET 的未来版本中能集成类似的功能。

查看英文原文: Microsoft Explores Manual Memory Management in .NET with Snowflake

2017 年 9 月 04 日 19:001187
用户头像

发布了 376 篇内容, 共 94.5 次阅读, 收获喜欢 216 次。

关注

评论

发布
暂无评论
发现更多内容

LiteOS内核源码分析:静态内存Static Memory

华为云开发者社区

内存管理 LiteOS 静态内存 Static Memory Membox

OAuth 2.0 与 OIDC

Zhang

OAuth 2.0 OIDC

哑面爽滑肤感胶浆

C13713145387

哑面爽滑肤感胶浆

【案例】新基建下星环科技城轨智能视频分析系统建设

星环科技

INNOVATE 2021 圆满落幕,一起盘点那些 AI 前沿实例!

亚马逊云科技 (Amazon Web Services)

喊话特斯拉、保时捷、戴森三巨头,户外造势热点!

󠀛Ferry

5月日更

哑面防水尼龙胶浆Nylon printing paste

C13713145387

哑面防水尼龙胶浆

Google官方关闭binary后,Android工程师怎么办?

Changing Lin

5月日更

不反粘水性台板胶Waterborne table glue

C13713145387

不反粘水性台板胶

聊聊我的编程时如何入门的

C语言与CPP编程

c++ 编程 程序人生 C语言 数据结构与算法

百分点大数据技术团队:政务数据安全管理实践

百分点大数据团队

postgresql数据库 timescaledb 时序库 超级表 块的压缩(compress_chunk()的应用)

Yang

数据库 postgresql

融云亮相 CDEC2021 上海站 全场景通信能力赋能企业数字升级

融云 RongCloud

Java中用户线程和守护线程区别这么大?

王磊

Java 并发编程 多线程 5月日更

基金会官宣3——看太空猫如何打破技术壁垒!

北熊老师

太空猫公链 太空猫社区联盟 TKM

一文抽丝剥茧带你掌握复杂Gremlin查询的调试方法

华为云开发者社区

调试 图数据库 Gremlin 遍历源 图遍历

Flink on Zeppelin 系列之:Yarn Application 模式支持

Apache Flink

flink

负载均衡续:万亿流量场景下的负载均衡实践

Coder的技术之路

负载均衡 高并发 负载均衡架构 架构·

NumPy之:结构化数组详解

程序那些事

Python 数据分析 Numpy 程序那些事

采取有效云网络安全策略的5个基本步骤

浪潮云

云计算

夏季不塞网胶浆、夏季不堵网胶浆

C13713145387

夏季不塞网胶浆

华云大咖说 | 安超DCM给数据中心“做主”

华云数据

MySQL数据迁移那些事儿

Simon

MySQL 数据迁移

一次过透气浆、印一次透气浆

C13713145387

透气胶浆 一次过透气浆

水性硅胶防滑透明浆

C13713145387

水性硅胶防滑透明浆

爽面弹力胶浆、哑面弹力胶浆

C13713145387

爽面弹力胶浆

立体水性石头拉浆

C13713145387

弹力抗刮硅油布胶浆

C13713145387

弹力抗刮硅油布胶浆

架构实战营模块三作业

日照时间长

架构实战营

Spring Cloud Kubernetes之实战一配置管理

Damon

五月日更

牛仔底色保护浆(喷砂工艺)

C13713145387

牛仔底色保护浆

边缘计算隔离技术的挑战与实践

边缘计算隔离技术的挑战与实践

“雪花”项目:Microsoft探索在.NET中实现手工内存管理-InfoQ