зависимости данных
Если оба доступа та же самая операция с переменной, и обе операции операции записи, то есть зависимость данных между двумя операциями. мин зависимость данных следующих трех типов:
имя | Пример кода | объяснение |
Читайте после записи | а = 1; Ь = а; | После записи переменной, прочитайте эту позицию. |
После Написать Написать | а = 1; А = 2; | После записи переменной, написать эту переменную. |
Чтение письма | а = Ь; Ь = 1; | После прочтения переменную, записать эту переменную. |
Выше трех случаев, до тех пор, как порядок выполнения двух операций переупорядочения, результат выполнения программы будет изменен.
Как уже упоминалось ранее, компилятор и процессор, возможно, придется делать операцию переназначения. Составитель и процессор на повторном заказе, будут соответствовать зависимости от данных, и компилятор не изменяет порядок исполнения зависимости от данных процессора существует две операции.
Обратите внимание, что зависимости данных между операциями и последовательность одной нити инструкций упомянутой зависимости от данных настоящего документа выполняется только для одного процессора, выполняющего в процессоре и другой поток не рассмотрены различные компиляторы и процессоры.
как если бы последовательная семантика
как если бы-последовательные средства семантический смысл: независимо от того, как изменение порядка (компилятор и процессор для того, чтобы повысить степень параллелизма), результат выполнения (однопоточный) программа не может быть изменена. Компилятор, время выполнения и процессоры должны соответствовать как-если-последовательной семантике.
Для того, чтобы соответствовать как-если-последовательной семантике, компилятор и процессор не делают операцию переназначения зависимости данных, поскольку такое изменение порядок может изменить результат. Однако отсутствие данных зависимостей между операциями, если эти операции могут быть перераспределены компилятор и процессор. Для иллюстрации рассмотрим следующий код площади образца окружности рассчитывается следующим образом:
двойная PI = 3.14; // двойной г = 1,0; // В двойной площадь = пи * г * г; // C
Выше трех операций зависимости от данных, как показано ниже:
Показано, есть зависимость данных между выше фигуры А и С, существует также зависимость данных между B и C. Таким образом, в конечной последовательности выполняемых команд, С может быть заказана в передней части А и В (С перемещается вверх А и В, результаты программы будут изменены). Но нет зависимостей данных между А и В, компилятор и процессор не могут выполнить переупорядочение последовательности между А и В. Цифра два исполнения заказа программы:
как если бы-порядковая семантика однопоточных программ для защиты от соблюдения как если бы последовательный семантика компилятора, среда и процессоры вместе, чтобы создать иллюзию программиста писать однопоточные программы: программа основана на однопоточных программах выполнение заказа. как если бы последовательный семантика однопоточных потребности программиста не беспокоиться о переназначении им мешать, нет необходимости беспокоиться о проблемах видимости памяти.
правила последовательности программы
Правила последовательности программы happens- до того, существует три happens- до вычисления отношения между образцом кодом выше окружностью области:
- Happens- перед В;
- В happens- перед тем C;
- 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 это переназначение. Переупорядочивание семантика здесь уничтожены многопоточные программы!
В однопоточной программе, текущий контроль изменения порядка выполнения зависимого результата не меняется (что, как-если-последовательная семантика позволяет контроль присутствия оператора опирается почему-то переупорядоченный), но многопоточная программа, переупорядочения операции управления зависимыми присутствует, он может изменить результат выполнения программы.