Являются ли коды операций MSIL атомарными? - PullRequest
9 голосов
/ 31 января 2012

Я немного поиграл с декомпилятором MSIL - ILDASM и попытался декомпилировать простой метод .NET.

Код операции выглядел примерно так:

.method private hidebysig static int32  Add(int32 a,
                                            int32 b) cil managed
{
  // Code size       18 (0x12)
  .maxstack  2
  .locals init ([0] int32 c,
           [1] int32 d,
           [2] int32 CS$1$0000)
  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  ldc.i4.5
  IL_0003:  add
  IL_0004:  stloc.0
  IL_0005:  ldarg.1
  IL_0006:  ldc.i4.s   10
  IL_0008:  add
  IL_0009:  stloc.1
  IL_000a:  ldloc.0
  IL_000b:  ldloc.1
  IL_000c:  add
  IL_000d:  stloc.2
  IL_000e:  br.s       IL_0010
  IL_0010:  ldloc.2
  IL_0011:  ret
}

Что мне интересно, так это атомные коды? Т.е. в ядре с вытесняющим планированием возможно ли выгрузить один код операции до его завершения? Приведенный здесь код операции может быть легко сопоставлен с инструкциями asm в значительной степени 1: 1, так как они имеют отдельные коды операций для загрузки, сохранения, добавления и т. Д.

Но что в случае более сложных кодов операций? например, «вызов», когда операндом является токен ссылки на метод, который должен сначала следовать для разрешения метода, а затем вызываться? это тоже атом?

Ответы [ 2 ]

14 голосов
/ 31 января 2012

Нет, не все коды операций являются атомными.Например, если вы используете stloc или ldloc для типов значений, которые больше, чем собственный размер указателя, это не гарантированно является атомарным.

Раздел 12.6.6 ECMA 335 гарантирует это в значительной степени:

Соответствующий интерфейс командной строки должен гарантировать, что доступ для чтения и записи к правильно выровненным ячейкам памяти, не превышающим размер собственного слова (размер типа native int), является атомарным (см. §12.6.2), когда вседоступ для записи в местоположение одинакового размера.Атомная запись не должна изменять никакие биты, кроме записанных.

... но есть примечание:

[Примечание: гарантированного атомарного доступа к 8-байтовые данные, когда размер собственного int равен 32 битам, даже если некоторые реализации могут выполнять атомарные операции, когда данные выровнены по 8-байтовой границе.примечание о конце]

Это означает, что любое хранение или чтение кода операции Int64 не обязательно будет атомарным на x86, например ...

0 голосов
/ 01 февраля 2012

Я не думаю, что атомарность определяется в инструкциях IL.Он определяется в терминах нагрузок и сохраняется из / в память.

А правила атомарности в отношении нагрузок и хранилищ сложны.Они имеют отношение к выравниванию и размеру хранимого значения.

Ваш пример «вызова» не имеет смысла: он не обращается к памяти.Концепция атомарности не связана с инструкцией вызова.

...