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

来自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的未来版本中能集成类似的功能。

原文地址:http://www.infoq.com/cn/news/2017/09/snowflake


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

loj#10050-The XOR Largest Pair【Trie(字典树)】

正题 题目链接:https://loj.ac/problem/10050 题目大意 有n个数,求两个数使他们异或起来最大。 解题思路 我们考虑构建一个TrieTrie。 两个分叉为0,1,对于每个数二进制下不够30位我们将其补够30位,然后再根据二进制01构建TrieTrie。 然后…

publiccms按照指定显示的日期格式,格式化日期的写法

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂 前言 现在是2021年12月30日20:21:37,距离2021年结束仅仅不到2天的时间了,时间恍如白驹过隙! 今天还是搞的publiccms,分享个简单的语法吧:在…

PL/SQL之JOB用法 (定时跑数据)

转载自 PL/SQL之JOB用法 (定时跑数据) 一、DBMS_Job包的用法 包含以下子过程: Broken()过程。 change()过程。 Interval()过程。 Isubmit()过程。 Next_Date()过程。 Remove()过程。 Run()过程。 Submit()过程。 …

Orleans解决并发之痛(四):Streams

Orleans 提供了 Stream扩展编程模型。此模型提供了一套API,使处理流更简单和更健壮。Stream默认提供了两种Provider,不同的流类型可能使用不同的Provider来处理,Simple Message Stream Provider 和 Azure Queue Stream Provider。Stream Prov…

POJ3764-The xor-longest Path【Trie(字典树)】

正题 POJ题目链接:http://poj.org/problem?id3764 其实loj也有题目:https://loj.ac/problem/10056 题目大意 一棵树,求两个点使他们的之间的边的异或值最大。 解题思路 我们可以先算出所以点离根的路上的边的异或值,记为didi,然后根据异…

2022的第一天,立个目标

时光如白驹过隙,一晃已经20多年过去了,在这些年中,可谓社会的百般形态都已经历过…… 14年辍学,独自一人来到济南打工。15年辞职,开始上学学计算机。16年继续学习。17年毕业,以优秀的成绩被留校任用为教员…

Oracle的分页实现

转载自 Oracle的分页实现 在Oracle中实现分页的方法大致分为两种,用ROWNUM关键字和用ROWID关键字,下面来详细介绍一下: 1、ROWNUM 其代码为: SELECT *FROM (SELECT ROW_.*, ROWNUM ROWNUM_FROM (SELECT *FROM TABLE1WHERE TA…

如何编写更好的SQL查询:终极指南-第二部分

上一篇文章《如何编写更好的SQL查询:终极指南-第一部分》中,我们学习了 SQL 查询是如何执行的以及在编写 SQL 查询语句时需要注意的地方。 下面,我进一步学习查询方法以及查询优化。 基于集合和程序的方法进行查询 反向模型中隐含的事实是…

POJ3349,洛谷SP4354-SnowflakeSnowSnowflakes【最小表示法,hash】

正题 洛谷评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidSP4354 POJ题目链接:http://poj.org/problem?id3349 题目大意 有n片雪花,他们6个角有不同的长度,如果两片雪花6个角长度相同(可以不同方向)&#…

publiccms实现遍历多级分类下的不同样式内容

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂 前言 现在是2022年1月2日17:06:51,假期这两天都在做publiccms。 上篇文章遗留的问题,最终还是没有按照富文本去做,后期在看吧; 今天遇到了个问题&…

四张图带你了解Tomcat系统架构--让面试官颤抖的Tomcat回答系列

转载自 四张图带你了解Tomcat系统架构--让面试官颤抖的Tomcat回答系列 俗话说,站在巨人的肩膀上看世界,一般学习的时候也是先总览一下整体,然后逐个部分个个击破,最后形成思路,了解具体细节,Tomcat的结构…

.NET Core 2.0应用程序大小减少50%

.NET Core 2.0应用程序减小体积瘦身官方工具 IL Linker。 IL Linker 来源于mono的linker https://github.com/mono/linker,目前还是预览版本。 在一般的情况下,链接器可以将应用程序的大小减少50%,大型应用程序的大小可能更有利…

P1368-工艺【最小表示法】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP1368 题目大意 n个块,可以进行若干次将最左边的方块放在最右边,然后如果前面那个比后面那个瑕疵度小那么前面那个就是美丽的,求一个让最美丽的序列。 解题思路 求…

Orleans解决并发之痛(五):Web API

通过前面几篇文章的介绍,可能会疑问怎么在实际开发中调用Grain,之前Demo的Client都是基于控制台应用程序,实际开发下可能是基于Web Form、Web API、MVC......,由于一时短路了,没有联想到控制台应用程序的方式怎么切到其…

ASP.Net Core WebApi几种版本控制对比

一、版本控制的好处: (1)有助于及时推出功能, 而不会破坏现有系统。 (2)它还可以帮助为选定的客户提供额外的功能。 API 版本控制可以采用不同的方式进行控制,方法如下: (1&…

POJ2279-Mr. Young's Picture Permutations【线性dp】

正题 题目链接:http://poj.org/problem?id2279 题目大意 有k列,每列人数不同,要求从左到右和从前到后身高都单调递减,学生高度是1∼N1∼N(人数总和) 解题思路 我们开一个五维数组,然后每次在人少那列填充,按照这总…

JoyOI(TYVJ)1071-LCIS【线性dp,LIS,LCS】

正题 题目链接:http://www.joyoi.cn/problem/tyvj-1071 题目大意 求两个序列的最长公共上升子序列。 code 我们先回顾一下LIS和LCS LIS:fimax{fj1}(j<i,aj<ai)fimax{fj1}(j<i,aj<ai)LCS:fi,jmax⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪fi−1,jfi,j−1fi−1,j−11(a…

asp.net core策略授权

在《asp.net core认证与授权》中讲解了固定和自定义角色授权系统权限&#xff0c;其实我们还可以通过其他方式来授权&#xff0c;比如可以通过角色组&#xff0c;用户名&#xff0c;生日等&#xff0c;但这些主要取决于ClaimTypes&#xff0c;其实我们也可以自定义键值来授权&a…

Safari浏览器不支持let声明的解决方式

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 前言 现在是2022年1月7日16:19:38,前几天用publiccms改了个网站&#xff0c;因为客户那边各种机型都有&#xff08;各PC端的分辨率也都不一样&#xff09;&#xff0c;所以导致页面呈现的效…

Executor 与 ExecutorService 和 Executors 傻傻分不清

转载自 Executor 与 ExecutorService 和 Executors 傻傻分不清 java.util.concurrent.Executor, java.util.concurrent.ExecutorService, java.util.concurrent. Executors 这三者均是 Java Executor 框架的一部分&#xff0c;用来提供线程池的功能。因为创建和管理线程非常心…