A especificação da CLI do ECMA define um modelo de memória fraca. Isso permite reordenar a ordem de execução do comando (que é útil para o desempenho). Mas escrever código de baixo nível para esse modelo é muito difícil.
E o mais importante - as arquiteturas de processador X86 / AMD64 têm um modelo de memória mais rígido (forte). Como resultado, a Microsoft implementou um modelo de memória mais forte em sua implementação CLR do que o descrito na especificação.
O modelo de memória foi alterado no .NET Core? Potencialmente, essa estrutura pode ser executada em arquiteturas com um modelo de memória mais fraco que o X86 / AMD64.
Além disso, o .NET Core incorpora Mono e outros. E, tanto quanto eu sei, o modelo de memória Mono é mais fraco, corresponde à ECMA.
Neste artigo Apresentando o .NET 5 escrito:
Expanda os recursos do .NET, aproveitando o melhor do .NET Core, .NET Framework, Xamarin e Mono.
Acho que, se não for agora, no futuro esses tempos de execução se fundirão em um único todo.
Abaixo no artigo está escrito:
Estamos no processo de substituir substitutos CoreCLR e Mono um pelo outro. Tornaremos tão simples quanto uma opção de compilação escolher entre as diferentes opções de tempo de execução.
Se eu entendi corretamente, haverá dois (ou mais) tempos de execução. E provavelmente todos terão seu próprio modelo de memória.
Do que estamos falando: Modelo de Memória .
Respostas:
O modelo de memória é específico para o tempo de execução; portanto, sua pergunta é "existem diferenças nos modelos de memória do CLR, CoreCLR e MonoRuntime".
Depois de pesquisar um pouco, a pergunta é muito, muito difícil de responder. Há a especificação ECMA que você mencionou, que fornece as garantias mínimas mínimas que todas as implementações devem fornecer. Há uma descrição concisa e muito agradável no blog de Joe Duffy para CLR 2.0. Então, para o .NET Framework, há este artigo em duas partes que fala sobre o modelo CLR em provavelmente mais detalhes do que é bom saber. Há até um artigo escrito sobre isso.
Para o MonoRuntime, encontrei este documento que fala sobre atômica e descreve a maneira como o Mono implementa isso, embora o nível de detalhe seja bastante baixo.
Encontrar detalhes do CoreCLR é ainda mais complicado. Existem alguns pontos-chave destacados neste tópico do GitHub dotnet / coreclr e uma discussão sobre leitura / gravação volátil neste .
A maneira mais simples de responder é - sim, ela mudou, com base nos recursos acima.
No entanto, existe uma segunda maneira de responder à sua pergunta e isso é simplesmente negar sua premissa - parece assumir que o modelo de memória mudou no sentido em que algumas pessoas inteligentes se sentaram, reescreveram as especificações da CLI do ECMA, inseridas no CoreCLR especificação do modelo de memória e esse é o novo modelo de memória. Esse não é o caso. As pessoas inteligentes mencionadas sentaram-se e, ao longo de muitos meses, refinaram o design para ser confiável, rápido, fácil de implementar e não violar as garantias mínimas das especificações. Citação do blog de Joe Duffy:
A especificação informal da ECMA é, infelizmente, tão formal quanto chegamos por enquanto. Não há descrição formal das alterações entre a especificação do ECMA e a implementação do CLR, nem uma descrição formal das alterações entre o CLR e o CoreCLR. E, mais importante, as diferenças específicas da implementação entre o CLI ECMA e o CLR / CoreCLR são exatamente isso - específicas da implementação - e não devem ser consideradas . A única fonte 100% confiável de como o modelo de memória do .NET Core é implementado é o código-fonte. E isso obviamente muda a cada confirmação, a cada versão, e não há garantia de que a equipe não jogue toda a instabilidade pela janela e a reescreva para que o .NET 5 seja exatamente o mesmo que a especificação da ECMA (por mais que seja improvável )
fonte