Углубленное понимание модели памяти Java (б) - переназначения

зависимости данных

Если оба доступа та же самая операция с переменной, и обе операции операции записи, то есть зависимость данных между двумя операциями. мин зависимость данных следующих трех типов:

имя Пример кода объяснение
Читайте после записи а = 1; Ь = а; После записи переменной, прочитайте эту позицию.
После Написать Написать а = 1; А = 2; После записи переменной, написать эту переменную.
Чтение письма а = Ь; Ь = 1; После прочтения переменную, записать эту переменную.

Выше трех случаев, до тех пор, как порядок выполнения двух операций переупорядочения, результат выполнения программы будет изменен.

Как уже упоминалось ранее, компилятор и процессор, возможно, придется делать операцию переназначения. Составитель и процессор на повторном заказе, будут соответствовать зависимости от данных, и компилятор не изменяет порядок исполнения зависимости от данных процессора существует две операции.

Обратите внимание, что зависимости данных между операциями и последовательность одной нити инструкций упомянутой зависимости от данных настоящего документа выполняется только для одного процессора, выполняющего в процессоре и другой поток не рассмотрены различные компиляторы и процессоры.

как если бы последовательная семантика

как если бы-последовательные средства семантический смысл: независимо от того, как изменение порядка (компилятор и процессор для того, чтобы повысить степень параллелизма), результат выполнения (однопоточный) программа не может быть изменена. Компилятор, время выполнения и процессоры должны соответствовать как-если-последовательной семантике.

Для того, чтобы соответствовать как-если-последовательной семантике, компилятор и процессор не делают операцию переназначения зависимости данных, поскольку такое изменение порядок может изменить результат. Однако отсутствие данных зависимостей между операциями, если эти операции могут быть перераспределены компилятор и процессор. Для иллюстрации рассмотрим следующий код площади образца окружности рассчитывается следующим образом:

двойная PI = 3.14; // 
двойной г = 1,0; // В 
двойной площадь = пи * г * г; // C

Выше трех операций зависимости от данных, как показано ниже:

Показано, есть зависимость данных между выше фигуры А и С, существует также зависимость данных между B и C. Таким образом, в конечной последовательности выполняемых команд, С может быть заказана в передней части А и В (С перемещается вверх А и В, результаты программы будут изменены). Но нет зависимостей данных между А и В, компилятор и процессор не могут выполнить переупорядочение последовательности между А и В. Цифра два исполнения заказа программы:

как если бы-порядковая семантика однопоточных программ для защиты от соблюдения как если бы последовательный семантика компилятора, среда и процессоры вместе, чтобы создать иллюзию программиста писать однопоточные программы: программа основана на однопоточных программах выполнение заказа. как если бы последовательный семантика однопоточных потребности программиста не беспокоиться о переназначении им мешать, нет необходимости беспокоиться о проблемах видимости памяти.

правила последовательности программы

Правила последовательности программы happens- до того, существует три happens- до вычисления отношения между образцом кодом выше окружностью области:

  1. Happens- перед В;
  2. В happens- перед тем C;
  3. Happens- прежде, чем C;

Здесь happens- до третьего отношений выводится из передачи happens- ранее.

Где A happens- перед В, но на самом деле он может запланировать выполнение B (см после переназначения порядок выполнения выше) перед А. Упомянутый в первой главе, если А happens- перед В, JMM не обязательно должны быть выполнены до A B. JMM первое требует только одну операции (результат) выполняются после операции видимой и секвенировал предыдущую операцию перед второй операцией. Результат работы выполнен здесь не должен быть виден оператором B и переназначение результатого выполнения операции А и B Процедуры, в соответствии с результатами операции A и B операции, выполненным в порядке happens- ранее. В этом случае, JMM думаю, что это изменение порядка не является незаконным (не запрещены), J позволяют такое переназначения.

В компьютере, программное обеспечение и аппаратные технологии технологии мы имеем общую цель: программу, не меняя результатов предпосылке, насколько возможно развитие параллельности. Составители и процессоры соответствуют этой цели, по определению happens-, прежде чем мы можем видеть, J соответствуют одной и той же цели.

Воздействие многопоточного переназначения

Теперь давайте посмотрим, если переназначения изменят результаты реализации многопоточных программ. Рассмотрим следующий пример кода:

class ReorderExample {
int a = 0;
boolean flag = false;

public void writer() {
    a = 1;                   //1
    flag = true;             //2
}

Public void reader() {
    if (flag) {                //3
        int i =  a * a;        //4
        ……
    }
}
}

флаг переменная является тег, используемый для идентификации, была ли написана переменная. Предполагается, что существуют две нити А и В, метод сначала выполняет автор (), а затем поток В затем выполняет метод чтения (). Тема B 4 при выполнении операции, способности видеть одну пару общих переменных в операции записи потока А?

Ответ: не обязательно видеть.

Поскольку нет зависимостей операции 1 и 2 операции передачи данных, компилятор, и этих два процессора не могут работать переупорядочение; Аналогично, 3 и 4 операции операции нет зависимостей данных, компилятор и процессор может работать с двумя тяжелыми Сортировка. Давайте посмотрим на то, когда оператор операция 1 и 2 переназначения может производить какой эффект? Рассмотрим следующую программу выполнения временную диаграмму:

Как было показано выше, в операции 1 и операция 2, изготовленного переупорядочения. Когда программа выполняется, флаг переменной флаг первой записи поток А, а затем поток В считывает эту переменную. Так как условие истинно, то поток B считывает переменную а. На данный момент не существует ни одна переменных было написано нитью А, где семантика многопоточной программы была разрушен переупорядоченной!

※ Примечание: Эта статья унифицирована с красной пунктирной линией стрелка указывает на ошибку операции чтения, чтения операция указывает на правильную виртуальную зеленую стрелку линию в.

Вот давайте посмотрим, когда операция 3 и 4 операции переназначения будет иметь никакого эффекта (переназначения средства можно регулировать в зависимости между прочим). Следующее является операция после 3 и 4 изменения порядка работы, временная диаграмма программы выполняется:

В процессе, зависимость управления работой 3 и 4 операции существует. Если код присутствует зависимость управления, это будет влиять на степень параллелизма в последовательности выполнения команд. С этой целью, процессор и компилятор, используя предположение управления (спекуляции) выполняет, чтобы преодолеть влияние степени корреляции параллелизма. Процессор Исполнения угадать пример, нить B выполняется заранее, и вычисляет процессор может считывать а * а, и временно хранит вычисленный результат вызываемой переупорядочивании буфера (буфер переупор БОРА) кэша аппаратного обеспечения. Далее, операция, когда условие определения 3 верно, положить результат вычисления записывается в переменную я.

Мы можем видеть из рисунка, операция выполняется предположение, по существу, 3 и 4 это переназначение. Переупорядочивание семантика здесь уничтожены многопоточные программы!

В однопоточной программе, текущий контроль изменения порядка выполнения зависимого результата не меняется (что, как-если-последовательная семантика позволяет контроль присутствия оператора опирается почему-то переупорядоченный), но многопоточная программа, переупорядочения операции управления зависимыми присутствует, он может изменить результат выполнения программы.

 

Опубликовано 136 оригинальных статей · вона похвала 6 · просмотров 1491

рекомендация

отblog.csdn.net/weixin_42073629/article/details/104741401