.NET Core中实现了哪种内存模型?


36

ECMA CLI规范定义了一个弱内存模型。这允许对命令执行顺序进行重新排序(这对于提高性能很有用)。但是,为这种模型编写低级代码非常困难。

最重要的是-X86 / AMD64处理器体系结构具有更严格的(强)内存模型。结果,Microsoft在其CLR实现中实现了比规范中描述的更强大的内存模型。

.NET Core中的内存模型是否已更改?该框架可能可以在内存模型比X86 / AMD64弱的体系结构上运行。

此外,.NET Core合并了Mono等。据我所知,Mono内存模型较弱,对应于ECMA。

.NET 5简介中撰写:

通过充分利用.NET Core,.NET Framework,Xamarin和Mono来扩展.NET的功能。

因此,我认为,如果不是现在,那么将来这些运行时将合并为一个整体。
在下面的文章中写道:

我们正在相互替代CoreCLR和Mono的过程中。我们将使它像构建开关一样简单,可以在不同的运行时选项之间进行选择。

如果我理解正确,将有两个(或更多)运行时。也许每个人都会有自己的记忆模型。

我们在说什么:内存模型


8
相关的。底线:CoreCLR认为自己不受限于在x86上复制CLR的更强保证(公平地说,在ARM上不切实际)。(同时,没有动机故意偏离当前x86在x86上的模型。)
Jeroen Mostert

“ .NET Core合并了Mono和其他”需要链接引用。我不相信这是真的,因为.NET Core CLR和Mono CLR仍然是分开的东西。
Lex Li

@LexLi-更新。添加了链接。
亚历山大·彼得罗夫

@亚历山大·彼得罗夫(Alexander Petrov)该链接涉及.NET 5,它将在2020年推出。.NETCore和Mono仍然是不同的平台。
V0ldek '19

Answers:


1

内存模型特定于运行时,因此您的问题实际上是“ CLR,CoreCLR和MonoRuntime的内存模型是否存在任何差异”。

经过研究后,这个问题确实非常难以回答。目前的ECMA规范,您已经提到,它给你的最低限度的保证,所有的实现都必须提供。Joe Duffy的 CLR 2.0 博客上有一个非常简洁的描述。然后,对于.NET Framework,有 部分的文章详细介绍了CLR模型,而不是健康的了解。甚至有论文写在那上面。

对于MonoRuntime,尽管详细程度很低,但我发现该文档讨论了原子并实际上描述了Mono实现此方法的方式。

查找CoreCLR的细节更加棘手。有在此强调了一些关键点的dotnet / coreclr GitHub的线程和关于性读/写操作的讨论在这一个

最简单的回答方法是-是的,根据上述资源,它已经更改。

但是,还有第二种方法来回答您的问题,那就是简单地否认它的前提-似乎假设内存模型发生了某种改变,即有些聪明的人坐下来,重写了ECMA CLI规范,将其纳入CoreCLR内存模型规范,这就是新的内存模型。事实并非如此。提到的聪明人坐了下来,经过几个月的努力,对设计进行了改进,使其可靠,快速,易于实施,并且没有违反规范的最低保证。从链接的乔·达菲的博客中引用:

我们已经建立了多年的非正式工作模型,并通过示例设计(...)进行设计,这很容易从一种实现方式转换为另一种实现方式。

不幸的是,非正式的ECMA规范是我们目前所获得的正式规范。没有对ECMA规范和CLR实现之间的更改的正式描述,也没有对CLR和CoreCLR之间的更改的正式描述。而且,更重要的是,ECMA CLI和CLR / CoreCLR之间特定于实现的区别只是特定于实现的,因此不能依赖。.NET Core内存模型的实现方式的唯一100%可靠的来源是源代码。显然,每次提交,每个发行版都会发生这种变化,并且不能保证团队不会将整个抖动扔到窗外​​,而将.NET 5重写为与ECMA规范完全相同(但是,这不太可能)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.