12.07.2015 Views

jeeconf-May2014-jmm-pragmatics

jeeconf-May2014-jmm-pragmatics

jeeconf-May2014-jmm-pragmatics

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

ВведениеSlide 3/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Введение: Картинка-детекторSlide 5/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


The Commission considers that it has fully implemented the inquiry it was asked to carry out andtherefore does not seek an extension of its mandate. As emphasized by Michael Kirby, the Chairof the Commission: “The responsibility now lies with the Member States of the United Nationsto provide follow up to its recommendations and protect the population of the DPRK fromfurther human rights violations and crimes against humanity.”In March 2013, the Human Rights Council already decided that it will transmit theCommission’s report to the Secretary-General and other relevant bodies of the United Nationsfor appropriate action. In this regard, the Commission has formulated a number ofrecommendations directly addressed to the United Nations Security Council, the GeneralAssembly, the Secretary-General and the High Commissioner for Human Rights.10. What recommendations does the Commission make to the DPRK?According to the Commission’s findings and recommendations, the DPRK requires profoundinstitutional reforms starting at the very top and centre of the nation’s institutions. The politicalprison camps and entire structures of surveillance, indoctrination and repression that serve thesole purpose of committing human rights violations must be dismantled. In this regard, reform ofthe security and justice sectors alone would not be enough. The decision-making processunderpinning them must be made more transparent and subject to effective checks and balancesincluding by establishing an independent and impartial judiciary, a multi-party political systemand elected people’s assemblies at the local and central level that emerge from genuinely freeand fair elections. The detailed recommendations of the Commission cover a number of specificmatters, including:- release of political prisoners,- acknowledgment and dismantlement of the political prison camps,- justice, penitentiary and security sector reform,- moratorium on and abolition of the death penalty,- independent media and access to information,- human rights education and abolition of war propaganda and national hatred,- freedom for Christians and other religious believers,- abolition of discrimination on the basis of state-assigned social class and relatedsurveillance,- gender equality,- access to the right to food, including through non-discriminatory policies, adjustment ofpublic expenditure patterns and unimpeded international humanitarian access,- lifting of the foreign and internal travel restrictions on ordinary citizens,- clarification of the fate of victims of international enforced disappearances and theirrepatriation,- reunification of separated families, and- the prosecution of perpetrators of crimes against humanity as part of a comprehensivetransitional justice process.6


Введение: Модель памятиЧасть спецификации абстрактной машины: модель того, какработает хранилище данных = модель памятиОказывается, что модели памяти достаточно ответить наодин простой вопрос...Slide 7/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


• Chest size is strongest predictor of lethality• Chest-to-AC ratio 50% of chest circumferenceShort rib polydactyly syndromeAsphyxiating thoracic dysplasia


Введение: ...тоже не всё простоХрестоматийный пример для C 89/99:int i = 5; (.)i = (++ i + ++i); (.)assert (13 == i); (.) // FAILSОтсутствие точек следования 4 в выражении приводит кнеопределённому поведению (между (.) (.) может бытьчто угодно)Модели памяти нужны в том числе для того, чтобы судить оповедении однопоточных программ4 ISO/IEC 9899:1999, «Annex C: Sequence Points»Slide 9/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Введение: Coming back to realityРеализации ЯП делают одну из двух вещей:1. Напрямую эмулируют абстрактную машину на входнойпрограмме и существующей машине (интерпретация)2. Специализируют абстрактную машину входной программой,и выполняют результат на существующей машине(компиляция)Реализациям нужно вложиться в специфицированное поведениеабстрактной машины ЯП.Slide 10/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Введение: Be careful what you wish forМодель памяти = trade-off междудолбанутостью программирования на языке,долбанутостью быстрой и корректной реализации языка,и долбанутостью хардвараМечтать не вредно: можно потребовать много удобных штук...вопрос в том, не уйдёт ли на создание подходящейреализации ЯП и железа к нему стотыщмильонов лет?Slide 11/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Введение: логика повествованияМы попробуем:1. Показать, что JMM нам нужна2. Обозначить наши желания3. Посмотреть, что нам реально доступно4. Понять, как спецификация балансирует между (2) и (3)5. Заглянуть, как работают (консервативные) реализации JMMФормальные требования JMM будут вот в такой рамкеSlide 12/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Access atomicitySlide 13/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Access atomicity: СказкаХочется:Атомарность доступа к базовым типамТ.е. для любого базового типа T:T t = V1;t = V2; T r1 = t;assert (r1 ∈ {V 1, V 2})Slide 14/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Access atomicity: РеальностьНужна поддержка со стороны железа, чтобы онодействительно делало атомарные чтения/записиЗасады:Отсутствие хардварных операций для крупных чтений: какпрочитать 8-байтный long на 32-битном x86? А на32-битном ARM-e?Требования подсистемы памяти: в примеру, припересечении кеш-лайна на x86 атомарность теряетсяSlide 15/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Access atomicity: Компромисс (часть 1/2)Чтения/записи атомарны для всего, кроме long и doublevolatile long и volatile double атомарныБольшая часть железа в 2004 умела читать до 32 бит зараз, с 64-битными чтениями пришлось миритьсяСсылки имеют битность, соответствующую машиннойМожем вернуть атомарность (подчёркивая возможныйperformance penalty)Slide 16/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Access atomicity: Компромисс (часть 2/2)Почти везде невыровненное чтение теряет атомарность(и уж точно теряет производительность)Реализация вынуждена выравнивать типы по их длине:o.o.j. samples . JOLSample_02_Alignment .A 5OFFSET SIZE TYPE DESCRIPTION0 12 ( object header )12 4 ( alignment / padding gap )16 8 long A.f5 http://openjdk.java.net/projects/code-tools/jol/Slide 17/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Access atomicity: QuizЧто напечатает?AtomicLong al = new AtomicLong();al.set(-1L); println(al.get());Slide 18/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Access atomicity: QuizЧто напечатает?AtomicLong al = new AtomicLong();al.set(-1L); println(al.get());Почему не 0 x FFFF FFFF 0000 0000?Slide 18/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Access atomicity: QuizЧто напечатает?AtomicLong al = new AtomicLong();al.set(-1L); println(al.get());Почему не 0 x FFFF FFFF 0000 0000?Никакой магии: «volatile long» внутри гарантирует.Slide 18/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Access atomicity: JMM 9Исключения для long/double вызваны прагматикой 2004 г.– Повсеместно распространены 32-битные x86– Древние, дремучие ARM’ы и PowerPC’ыВ 2014 году уже всё гораздо лучше!– В серверном мире остались вообще 32-битные машины?– Даже на 32-битных давно есть 64-битные (векторные) инструкции– На большинстве платформ long/double де-факто атомарны– ...но мы всё равно заставляем писать volatile, ибо WORAВопрос: Может, пора выпилить эти исключения изспецификации?Slide 19/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Access atomicity: JMM 9x86, Ivy Bridge, 64-bit:6Никакой разницы:double уже давноатомаренlong работает нанативной битности6 http://shipilev.net/blog/2014/all-accesses-are-atomic/Slide 20/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Access atomicity: JMM 9x86, Ivy Bridge, 32-bit:7Разницы чуть-чуть:double уже давноатомаренlong на живыхвекторных инструкциях7 http://shipilev.net/blog/2014/all-accesses-are-atomic/Slide 21/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Access atomicity: JMM 9ARMv7, Cortex-A9, 32-bit:8Разницы чуть-чуть:double уже давноатомаренlong на живыхвекторных инструкциях8 http://shipilev.net/blog/2014/all-accesses-are-atomic/Slide 22/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Access atomicity: Value typesМногие хотят value types в Java. Кроме всяких бонусов, онивносят лёгкий аромат неадеквата в модель памяти.К примеру, С/C++11 требует атомарность для любого POD:typedef struct TT {int a, b, c, ..., z; // 104 bytes} T;std::atomic atomic();atomic.set(new T()); T t = atomic.get();Slide 23/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Access atomicity: Value typesМногие хотят value types в Java. Кроме всяких бонусов, онивносят лёгкий аромат неадеквата в модель памяти.К примеру, С/C++11 требует атомарность для любого POD:typedef struct TT {int a, b, c, ..., z; // 104 bytes} T;std::atomic atomic();atomic.set(new T()); T t = atomic.get();Реализация вынуждена «приседать» и на set(), и наget()Slide 23/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Word tearingSlide 24/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Word tearing: СказкаХочется:Незалежность операций над независимыми элементами(полями, элементами массивов и т.п.). Например:T[] as = new T[...]; as[1] = as[2] = V0;as[1] = V1; as[2] = V1; T r1 = as[1];T r2 = as[2];assert (r1 == r2)Slide 25/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Word tearing: РеальностьНужна поддержка со стороны железа, чтобы онодействительно делало независимые чтения/записиЗасады:Отсутствие хардварных операций для мелкихчтений/записей: как атомарно записать 1-битный boolean,если атомарно можно записать N (N ≥ 8) бит?Slide 26/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Word tearing: РешениеWord tearing запрещёнБольшая часть железа умеет адресовать от 8 бит за разЕсли железо умеет адресовать минимум N бит, значит,минимальный размер базового типа в реализации тожеразумно сделать N битНа большинстве платформ все типы не теряют память(кроме 8-битного boolean)Slide 27/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Word tearing: Experimental ProofОбъекты выровнены на 8 байт.Всё, кроме boolean, точного размера под диапазон значений:$ java -jar jol - internals . jar ...Running 64- bit HotSpot VM.Using compressed references with 3- bit shift .Objects are 8 bytes aligned .Field sizes by type : 4, 1, 1, 2, 2, 4, 4, 8, 8 [ bytes ]Array element sizes : 4, 1, 1, 2, 2, 4, 4, 8, 8 [ bytes ]Slide 28/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Word tearing: QuizЧто напечатает?BitSet bs = new BitSet();bs.set(1); bs.set(2); println(bs.get(1));println(bs.get(2));9 Есть ли хоть одна реализация, которая напечатает (F, F)?Slide 29/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Word tearing: QuizЧто напечатает?BitSet bs = new BitSet();bs.set(1); bs.set(2); println(bs.get(1));println(bs.get(2));Напечатает любую 9 из комбинаций (T, T), (F, T), (T, F).9 Есть ли хоть одна реализация, которая напечатает (F, F)?Slide 29/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Word tearing: Bit fieldsМногие хотят struct’ы в Java, или вообще способконтролировать layout объектов. Ага, удачи, сэмулируй это:typedef struct TT {unsigned a:7;unsigned b:3;} T;T t;t.a = 42; r1 = t.b;Slide 30/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Word tearing: Bit fieldsМногие хотят struct’ы в Java, или вообще способконтролировать layout объектов. Ага, удачи, сэмулируй это:typedef struct TT {unsigned a:7;unsigned b:3;} T;T t;t.a = 42; r1 = t.b;Реализация вынуждена «приседать» и на записи a, и начтении b.Slide 30/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Word tearing: Bit fieldsМногие хотят struct’ы в Java, или вообще способконтролировать layout объектов. Ага, удачи, сэмулируй это:typedef struct TT {unsigned a:7;unsigned b:3;} T;T t;t.a = 42; r1 = t.b;Реализация вынуждена «приседать» и на записи a, и начтении b. (C/C++11 на это феерически забил)Slide 30/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Word tearing: JMM 9Slide 31/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRFSlide 32/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: СказкаХочется:Простой способ анализировать приложения.К примеру:opA();opB();opC();opD();opE();opF();Удобно думать, что операции исполняются по порядку,иногда переключаясь на другой поток.Slide 33/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Сказка (формальнее)Sequential Consistency (SC):(Лампорт, 1979): «Результат любого исполнения не отличим отслучая, когда все операции на всех процессорах исполняются внекотором последовательном порядке, и операции на конкретномпроцессоре исполняются в порядке, обозначенном программой»Slide 34/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Сказка (формальнее)Sequential Consistency (SC):(Лампорт, 1979): «Результат любого исполнения не отличим отслучая, когда все операции на всех процессорах исполняются внекотором последовательном порядке, и операции на конкретномпроцессоре исполняются в порядке, обозначенном программой»Slide 34/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Сказка (формальнее)SC – иезуитское определение:Программу можно сильно переколбасить, лишь бы нашёлсянужный порядок в оригинальной программе, которыйприводит к тому же SC-результатуint a = 0, b = 0;a = 1; b = 2;print(b); print(a);→...print(2); print(1);Slide 35/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: РеальностьОтношения оптимизаций и модели памяти можно выразитьчерез перестановки чтений/записейМожно ли осуществить это преобразование?int a = 0, b = 0;r1 = a;r2 = b;→int a = 0, b = 0;r2 = b;r1 = a;Slide 36/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Реальностьint a = 0, b = 0;r1 = a; b = 2;r2 = b; a = 1;→int a = 0, b = 0;r2 = b;b = 2;a = 1;r1 = a;В исходной программе при SC обязательно либо «r2 = b»,либо «a = 1» должно быть последним, а значит, (r1, r2)либо (*, 2), либо (0, *).Новая программа приводит к (r1, r2) = (1, 0)Slide 37/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: РеальностьSequential Consistency - очень привлекательная модель.Даёшь её в массы в XVII пятилетке!Очень сложно определить, какие оптимизации можноделать, не нарушая при этом SСВ теории, какой-нибудь Глобальный МегаОптимизатор(ГМО) может сделать такой анализНа практике и рантаймы, и железо получаютсяисключительно без ГМО ⇒ большая часть оптимизацийзапрещенаSlide 38/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Реальность в хардваре10 http://en.wikipedia.org/wiki/Memory_orderingSlide 39/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Реальность в хардвареПроцессоры жёстко спекулируют и переупорядочивают операции(ради производительности!)1010 http://en.wikipedia.org/wiki/Memory_orderingSlide 39/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: немного определенийДоступы в память конфликтуют, если они работают содним местом в памяти и хотя бы один из этих доступов –записьПрограмма содержит гонку (data race), если два доступаконфликтуют и происходят одновременно (из несколькихпотоков, не связаны синхронизацией)Программа с гонками рождает непредсказуемые результаты!Язык вынужден давать механизмы упорядочивания доступов.Slide 40/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: компромиссНам нужна более слабая модель!(Вспоминаем про trade-off-ы)Если подойти к делу основательно, то:Разрешим оптимизации в рантаймах и хардвареПозволим упорядочивать операции без взрыва мозгадевелоперовСпецификация будет невменяема, но чуть менее чемнаполовинуSlide 41/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: JMM Formalism TL;DR;JMM специфицирует, какие результаты разрешены языкомJMM определяет действия. Действия тащат на себезначения: e.g. «read(x):1» означает, что мы действительнопрочитали «1» из «x». Результат конкретной программыразрешён, если есть действие, которое читает нужное намзначениеДействия связаны в исполнения, которые дают ещё ипорядки над действиями ( −→, po−→, so−→, sw−→). hbЕсли валидноеисполнение даёт нам какой-то результат, то этот результатразрешёнSlide 42/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Program OrderProgram Order (PO) связывает действия внутри одного потокаif (x == 2) { read(x):1y = 1;} else {z = 1; write(z,1)}r1 = y;read(y):2popoSlide 43/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Program OrderPO – линейный порядок(Операторы программы не образуют линейный порядок вообще!)if (x == 2) { read(x):2y = 1; write(y,1)} else {z = 1;}r1 = y;read(y):1popoSlide 44/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: По дороге к валидным исполнениямГде-то во множестве всехвозможных исполненийможет быть исполнение,которое оправдываетконкретный результатконкретной программы.Вся суть JMM в том,чтобы найти такое исполнение.Slide 45/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Program OrderIntra-thread consistency: для каждого потока действия в POте же самые, что получились бы в изолированном исполненииif (x == 2) { read(x):2y = 1;} else {z = 1; write(z,1)}r1 = y;read(y):1popoSlide 46/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: PO constraintsIntra-thread consistencyвыделяет исполнения,которыми можно пользоватьсядля конкретнойпрограммы.Это единственное место,где в JMM протекаетинформация о последовательнойпрограмме!Slide 47/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Synchronization ActionsСлабые модели памяти упорядочивают не все операции,а только некоторые избранные.Synchronization Actions (SA) :volatile read, volatile writelock monitor, unlock monitor(синтетические) первое и последнее действие в потокедействия, запускающие потокдействия, обнаруживающие останов потока (Thread.join(),Thread.isInterrupted() и т.п.)Slide 48/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Synchronization OrderSynchronization Actions образуют Synchronization Order (SO)SO – линейный порядок– каждый поток видит SA в одном и том же порядке– это единственный порядок действий, который нужно иметьлинейнымПорядок действий в SO совместен с PO– SA в одном потоке видны в порядке программы– инварианты парности lock/unlock выдержаныSynchronization order consistency :Все чтения в SO видят последние записи в SO.Slide 49/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: SO constraints, Dekkervolatile int x, y;x = 1; y = 1;int r1 = y; int r2 = x;Подумаем: какие (r1, r2) допустимы?Slide 50/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: SO constraints, Dekkervolatile int x, y;x = 1; write(x, 1) y = 1; write(y, 1)int r1 = y; read(y):? int r2 = x; read(x):?Ввиду intra-thread consistency, нам стоит рассматриватьисполнения, состоящие из четырёх действийSlide 51/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: SO constraints, Dekkervolatile int x, y;x = 1; write(x, 1) y = 1; write(y, 1)point r1 = y; read(y):? int r2 = x; read(x):?poДействия в потоках связаныpo−−→Slide 51/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: SO constraints, Dekkervolatile int x, y;x = 1; write(x, 1) y = 1; write(y, 1)point r1 = y; read(y):? int r2 = x; read(x):?poВсе эти действия работают с volatile, следовательно, все они вSO. Однако, этот порядок можно наложить разнымивариантами...Slide 51/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: SO constraints, Dekkervolatile int x, y;x = 1; write(x, 1) y = 1; write(y, 1)sopoint r1 = y; read(y):? int r2 = x; read(x):?sopoВариант 1:so−→ не совместен сsopo−−→, исполнение можно отброситьSlide 51/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: SO constraints, Dekkervolatile int x, y;x = 1; write(x, 1) y = 1; write(y, 1)sopoint r1 = y; read(y):? int r2 = x; read(x):?sosoposoВариант 2: −→ совместен с −−→, poа ввиду SO consistency чтенияобязаны увидеть read(y):0 и read(x):1Slide 51/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: SO constraints, Dekkervolatile int x, soy;x = 1; write(x, 1) y = 1; write(y, 1)point r1 = y; read(y):? int r2 = x; read(x):?soposoВариант 3: −→ совместен с −−→, poа ввиду SO consistency чтенияобязаны увидеть read(y):1 и read(x):1soSlide 51/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Наблюдение: SA are SC!Synchronization actions – sequentially consistent!volatile int x, y;x = 1; y = 1;int r1 = y; int r2 = x;Последнее действие в PO должно быть последним в SOСледовательно, read(y):? или read(x):? будет последним,и точно увидит записьСледовательно, (r1, r2) = (0, 0) запрещеноSlide 52/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: SO constraints, IRIWЕщё классика, «Independent Reads of Independent Writes» (IRIW):volatile int x, y;x = 1; y = 1; int r1 = y; int r3 = x;int r2 = x; int r4 = y;Все исполнения, дающие (r1, r2, r3, r4) = (1, 0, 1, 0) ломаютили SO consistency, или совместность SO и POSlide 53/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: SO constraints, IRIWЕщё классика, «Independent Reads of Independent Writes» (IRIW):volatile int x, y;x = 1; y = 1; int r1 = y; int r3 = x;int r2 = x; int r4 = y;Все исполнения, дающие (r1, r2, r3, r4) = (1, 0, 1, 0) ломаютили SO consistency, или совместность SO и POПосыпьте Java-программу volatile-ами, и sequentialconsistency к вам вернётся!Slide 53/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: SO constraintsSynchronization orderconsistency даёт SC-скелетдля программы.Это единственный линейныйпорядок, которыйтребует спецификация.Slide 54/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Проблемы с SOСам по себе SO ещё не приводит к слабой модели:«Всё или ничего»: или мы превращаем все действия в SA,или миримся с тем, что не-SA действия «плавают» попрограмме, сея хаос и разрушенияВсе действия в SA превратить нельзя, потому что мыпревратим всё в SC, и разрушим оптимизацииНужен более слабый порядок для не-SA операций:happens-beforeSlide 55/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Прекурсоры HB, публикацияint x; volatile int g;x = 1; write(x, 1) int r1 = g; read(g):?g = 1; write(g, 1) int r2 = x; read(x):?Подумаем: запрещено ли здесь (r1, r2) = (1, 0)?Slide 56/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Прекурсоры HB, публикацияint x; volatile int g;x = 1; write(x, 1) int r1 = g; read(g):?g = 1; write(g, 1) int r2 = x; read(x):?sososo−→ упорядочивает только действия над g!Получаем либо read(g):0, либо read(g):1Slide 56/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Прекурсоры HB, публикацияint x; volatile int g;x = 1; write(x, 1) int r1 = g; read(g):?g = 1; write(g, 1) int r2 = x; read(x):?sosoЕсть валидные исполненияи с read(x):0, и с read(x):1,вне зависимости от read(g):?Slide 56/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Synchronizes-With Order (SW)PO не связывает действия разных потоковЧтобы рассуждать о межпотоковом поведении, нам нуженпорядок, который связывает действия разных потоковПока что у нас есть SO, но он линеен, и приносит слишкомстрогие ограничения. Поэтому нам нужен отдельныйчастичный порядок:Synchronizes-With Order (SW):Подпорядок SO, ограниченныйконкретными reads/writes, locks/unlocks, etc.Slide 57/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Synchronizes-With (SW)int x; volatile int g;x = 1; write(x, 1) int r1 = g; read(g):0g = 1; write(g, 1) int r2 = x; read(x):?Большинство SA не связано друг с другомsw−−→Slide 58/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Synchronizes-With (SW)int x; volatile int g;x = 1; write(x, 1) int r1 = g; read(g):1g = 1; write(g, 1) int r2 = x; read(x):?swЕсли одно SA видит другое, то они связаныЭто даёт связь «между потоками».sw−−→.Slide 58/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Synchronizes-With (SW)int x; volatile int g;x = 1; write(x, 1) int r1 = g; read(g):1poswg = 1; write(g, 1) int r2 = x; read(x):?poДостроим для этого случая ещё и −−→.poЭто даёт связь «внутри потока».Slide 58/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Happens-before (HB)int x; volatile int g;x = 1; write(x, 1) int r1 = g; read(g):1hbhbg = 1; write(g, 1) int r2 = x; read(x):?hbhb−→ = транзитивное замыкание объединенияpo−−→ иsw−−→Slide 59/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Happens-before (HB)int x; volatile int g;x = 1; write(x, 1) int r1 = g; read(g):1hbhbg = 1; write(g, 1) int r2 = x; read(x):?hbHB consistency : чтения видят либо последнюю запись влибо что-нибудь ещё через гонкуhb−→,Slide 59/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Happens-before (HB)Пусть W (r) – запись, которую видит r, и A – множество всехдействий программы. Тогда happens-before consistency:∀r ∈ Reads(A) : ¬(rhb−→ W (r))∧¬(∃w ∈ W rites(A) : (W (r) hb−→ w) ∧ (whb−→ r))Slide 60/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Happens-before (HB)Пусть W (r) – запись, которую видит r, и A – множество всехдействий программы. Тогда happens-before consistency:∀r ∈ Reads(A) : ¬(rhb−→ W (r)) ∧¬(∃w ∈ W rites(A) : (W (r) hb−→ w) ∧ (whb−→ r))Либо W (r) не связано с r (гонка), либо W (r) hb−→ rSlide 60/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Happens-before (HB)Пусть W (r) – запись, которую видит r, и A – множество всехдействий программы. Тогда happens-before consistency:∀r ∈ Reads(A) : ¬(rhb−→ W (r))∧¬(∃w ∈ W rites(A) : (W (r) hb−→ w) ∧ (whb−→ r))Отсутствуют intervening writes (работает при W (r) hb−→ r)Slide 60/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: HB, Publishint x; volatile int g;x = 1; write(x, 1) int r1 = g; read(g):?g = 1; write(g, 1) int r2 = x; read(x):?Проанализируем с точки зрения HB consistency...Slide 61/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: HB, Publishint x; volatile int g;x = 1; write(x, 1) int r1 = g; read(g):1hbhbg = 1; write(g, 1) int r2 = x; read(x):1hbВариант 1: HB consistent, видим последнюю запись в(r1, r2) = (1, 1)hb−→Slide 61/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: HB, Publishint x; volatile int g;x = 1; write(x, 1) int r1 = g; read(g):0hbg = 1; write(g, 1) int r2 = x; read(x):0hbВариант 2: HB consistent, видим значение по-умолчанию(r1, r2) = (0, 0)Slide 61/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: HB, Publishint x; volatile int g;x = 1; write(x, 1) int r1 = g; read(g):0hbg = 1; write(g, 1) int r2 = x; read(x):1hbВариант 3: HB consistent (!), чтение через гонку!(r1, r2) = (0, 1)Slide 61/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: HB, Publishint x; volatile int g;x = 1; write(x, 1) int r1 = g; read(g):1hbhbg = 1; write(g, 1) int r2 = x; read(x):0hbВариант 4: HB inconsistent, результат отброситьSlide 61/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: ОпределениеSequentialConsistency-DataRaceFree: «Correctly synchronizedprograms have sequentially consistent semantics»Перевод: В программе нет гонок ⇒ все чтения видятупорядоченные записи ⇒ результат исполнения программыможно объяснить каким-нибудь SC-исполнениемИнтуиция №1: Операции над локальными данными (какправило) не ломают SCИнтуиция №2: Операции над глобальными даннымисинхронизованы SC-примитивами (доступными прямо вжелезе)Slide 62/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Публикацияreleasevolatile int g;...writes, writes, writes... ...write(g, 1)hbread(g):1... ...reads, reads, reads...acquireПредыдущий пример можно обобщить в «safe publication»:Работает только на одной и той же переменной, одном и томже монитореSlide 63/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Публикацияreleasevolatile int g;...writes, writes, writes... ...write(g, 1)hbread(g):1... ...reads, reads, reads...acquireПредыдущий пример можно обобщить в «safe publication»:Работает только на одной и той же переменной, одном и томже монитореРаботает только если мы увидели ту самую release-записьSlide 63/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Публикацияreleasevolatile int g;...writes, writes, writes... ...write(g, 1)hbread(g):1... ...reads, reads, reads...acquireПредыдущий пример можно обобщить в «safe publication»:Работает только на одной и той же переменной, одном и томже монитореРаботает только если мы увидели ту самую release-записьВсегда парные действия! Нельзя сделать release в однойстороне, и не делать acquire в другой.Slide 63/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: QuizCR 9234251: Optimize getter in C.get()class C {T val ;public synchronized void set (T v) {if ( val == null ) { val = v; }}public synchronized T get () {// TODO FIXME PLEASE PLEASE PLEASE :// THIS ONE IS TOO HOT IN PROFILER !!!111 ONEONEONEreturn val ;}}Slide 64/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: QuizRFR (XS) CR 9234251: Optimize getter in C.get():class C {T val ;public synchronized void set (T v) {if ( val == null ) { val = v; }}public T get () {// This one is safe without the synchronization .// ( Yours truly , CERTIFIED SENIOR JAVA DEVELOPER )return val ;}}Slide 65/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: QuizRFR (XS) CR 9234251: Optimize getter in C.get():class C {static volatile int BARRIER; int sink;T val ;public synchronized void set (T v) {if ( val == null ) { val = v; }}public T get () {sink = BARRIER; // acquire membar// Obviously , we need a memory barrier here !// ( Yours truly , SUPER COMPILER GURU )return val ;}}Slide 66/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: QuizТак уже лучше: вернули SW-ребро, восстановили HB.class C {volatile T val ;public synchronized void set (T v) {if ( val == null ) { val = v; }}public T get () {// This one is safe without the synchronization .// . Now it ’s safe .// ( $PROJECT techlead , overseeing certified idiots )return val ;}}Slide 67/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


ПЕРЕРЫВ10 минут на глотнуть воздуха свободы(или перебежать на другой доклад)Slide 68/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Roach MotelТребования HBconsistency разрешаютпростой класс локальныхоптимизаций, «roachmotel»Slide 69/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Roach Motelhbwrite(x, 1)int x, y;volatile int g;release(g)write(y, 1)hbread(x):?acquire(g)read(y):?hbwrite(y, 1) можно переставитьперед release, потомучто он не мешает никакимзависимостям по x, аread(y):? справа всё равноможет видеть эту запись черезгонкуSlide 70/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Roach Motelint x, y;volatile int g;hbwrite(x, 1)release(g)write(y, 1)hbread(x):?acquire(g)read(y):?hbread(x):? можно переставитьза acquire, потому чтоон всё равно может видетьwrite(x, 1) через гонкуSlide 70/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Roach Motelint x, y;volatile int g;hbwrite(x, 1)release(g)write(y, 1)hbread(x):?acquire(g)read(y):?hbВ целом, «Вносибельно послеacquire» + «Вносибельноперед release» = «Вносибельнов acquire+releaseблоки» ⇒ работает, к примеру,lock coarsening.Slide 70/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Roach Motelhbwrite(x, 1)int x, y;volatile int g;release(g)write(y, 1)hbread(x):?acquire(g)read(y):?hbwrite(x, 1) нельзя простопереставить за release, потомучто мы потенциальновыносим его из −→. hbКонсервативнаяреализация не знает,есть ли дальше чтение x,которое должно его увидеть.ГМО мог бы глобальным анализомэто узнать и таки переставить.Slide 70/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Roach Motelhbwrite(x, 1)int x, y;volatile int g;release(g)write(y, 1)hbread(x):?acquire(g)read(y):?hbread(y):? нельзя просто переставитьперед acquire, потомучто мы потенциальновыносим его из −→. hbКонсервативнаяреализация не знает,есть ли вверх по течениюзапись, которую мы должныувидеть. ГМО мог бы этоузнать и таки переставить.Slide 70/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: QuizЧто напечатает? Варианты: 0, 41, 42, 43, int a = 0;volatile boolean ready = false;a = 41; while(!ready) {};a = 42; println(a);ready = true;a = 43;Slide 71/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: QuizЧто напечатает? Варианты: 0, 41, 42, 43, int a = 0;volatile boolean ready = false;a = 41; while(!ready) {};a = 42; println(a);ready = true;a = 43;Напечатает или 42 (последняя в HB), или 43 (гонка).Slide 71/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Quiz #2Что напечатает? Варианты: 0, 41, 42, 43, int a = 0;boolean ready = false;a = 41; while(!ready) {};a = 42; println(a);ready = true;a = 43;Slide 72/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Quiz #2Что напечатает? Варианты: 0, 41, 42, 43, int a = 0;boolean ready = false;a = 41; while(!ready) {};a = 42; println(a);ready = true;a = 43;Все варианты возможны (гонка, гонка, гонка!)Slide 72/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: HB constraintsHappens-before consistencyчастично упорядочиваетобычные чтения/записи.HB определён толькодля конкретных парчтений-записей.Slide 73/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Немножко бенчмарковhttps://github.com/shipilev/<strong>jmm</strong>-benchmarks/2x12x2 Xeon E5-2697, 2.70GHzOEL 6, JDK 7u40, x86_64Измеряем не производительностьспеки, а производительностьнекоторой её реализацииSlide 74/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Немножко бенчмарковhttps://github.com/shipilev/<strong>jmm</strong>-benchmarks/2x12x2 Xeon E5-2697, 2.70GHzOEL 6, JDK 7u40, x86_64Измеряем не производительностьспеки, а производительностьнекоторой её реализацииSlide 74/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Hoisting@State ( Scope .( Benchmark | Thread ))public static class Storage {private ( volatile ) int v = 42;}@GenerateMicroBenchmarkpublic int test ( Storage s) {int sum = 0;for ( int c = 0; c < s.v; c ++) {sum += s.v;}return sum ;}Slide 75/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: HoistingНе так страшен volatile, сколько поломанные оптимизации:5000Summing up the field in for−loopoperations/usec400030002000100000 10 20 30 40 50threadsPlain (unshared) Plain (shared) Volatile (unshared) Volatile (shared)Slide 76/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: Writes@State ( Scope .( Benchmark | Thread ))public static class Storage {private ( volatile ) int v = 42;}@GenerateMicroBenchmarkpublic int test ( Storage s) {BlackHole . consumeCPU (8); // ~15 nsreturn s.v ++;}Slide 77/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: WritesНе так страшен volatile, сколько data sharing:2500Incrementing the field continuously (with a backoff)operations/usec20001500100050000 10 20 30 40 50threadsBaseline Plain (unshared) Plain (shared) Volatile (unshared) Volatile (shared)Slide 78/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


SC-DRF: JMM 9SC-DRF нынче признаётся наиболее удачной моделью– Формально идея существует ещё с 90-х годов– Адаптировано в Java в 2004– ...и теперь ещё в C/C++ в 2011В некоторых местах за SC приходится очень больно платить– Пример: PowerPC + IRIW = кровь, кишки, расчленёнка– Пример: Linux Kernel RCU = релаксации SC для ARM/PowerPCместами дают конские приросты производительности ...и дажебез кажущегося взрыва мозгаВопрос: можно ли как-нибудь ослабить это требование, неразрушив всю модель?Slide 79/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


OoTASlide 80/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


OoTA: Сказка«SC-DRF. Построй свою любовь»Локальные трансформации разрешены, пока не встретимсинхронизациюОтношения локальных трансформаций и синхронизацийтоже определены (в самом простом случае, «roach motel»)Если локальные трансформации переколбашиваютконфликтные доступы, значит, там и так была гонка, идевелопер ССЗБSlide 81/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


OoTA: РеальностьНо есть случаи, когда локальные трансформации ломают SC:int a = 0, b = 0;r1 = a; r2 = b;if (r1 != 0) if (r2 != 0)b = 42; a = 42;Корректно синхронизована:все SC исполнения не содержат гонок.Возможно только (r1, r2) = (0, 0).Slide 82/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


OoTA: ОптимизацииНемножко спекулятивных оптимизаций:почему бы не записать в b, и откатить, «если что»?(Покажем на компиляторах, хотя может и хардвар спекулировать)int a = 0, b = 0;int r1 = a;if (r1 != 0)b = 42;Slide 83/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


OoTA: ОптимизацииНемножко спекулятивных оптимизаций:почему бы не записать в b, и откатить, «если что»?(Покажем на компиляторах, хотя может и хардвар спекулировать)int a = 0, b = 0;int r1 = a;if (r1 != 0)b = 42;→int r1 = a;b = 42;if (r1 == 0)b = 0;Slide 83/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


OoTA: ОптимизацииНемножко спекулятивных оптимизаций:почему бы не записать в b, и откатить, «если что»?(Покажем на компиляторах, хотя может и хардвар спекулировать)int a = 0, b = 0;int r1 = a;if (r1 != 0)b = 42;→int r1 = a;b = 42;if (r1 == 0)b = 0;→b = 42;int r1 = a;if (r1 == 0)b = 0;Slide 83/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


OoTA: Как ныне сбирается вещий Эдип...int a = 0, b = 0;b = 42;r2 = b;if (r2 != 0)a = 42;r1 = a;if (r1 == 0)b = 0;Приводит к (r1, r2) = (42, 42)В присутствии гонок спекуляция превращается всамоподтверждающееся пророчество!Slide 84/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


OoTA: Causality loopsJLS вкратце: OoTA значения запрещены.Если мы прочитали значение, то это значит, что кто-то егодо нас записалСамая сложная часть спецификации: весь формализм вJLS 17.4.8 построен для того, чтобы дать определение этому«до нас» = «causality requirements»JMM определяет специальный процесс валидацииисполнений через «commit»-ы действийSlide 85/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


OoTA: Commit semantics


OoTA: Commit semanticsSlide 86/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


OoTA: C/C++11Спецификация OoTA настолько сложна, что C/C++11 сдался:C/C++11 не специфицировала эту часть своей моделиИзбежала всего геморроя со спецификацией (Пирровапобеда)Особенно в присутствии relaxed atomics, которые нам нужны,потому что мы же любим низкоуровневые оптимизации, да?Эксперты в C/C++1x WG чешут темечко, как (в теории)запретить компиляторам спекулятивно рождать значенияSlide 87/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


OoTA: JMM 9Пути решения проблемы OoTA:1. Продолжать в том же духе: предпринять попыткудо/перепилить формализм, чтобы он былпонимабелен/верифицируем и исправить в нём ошибки2. Консервативно запретить спекулятивные записи: это будетозначать LoadStore перед каждой записью3. Сдаться, и надеяться на вменяемость реализацийSlide 88/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


OoTA: Commit semanticsCommit semantics делаетфинальные проверки,чтобы исключить причинностныециклы.Это нужно, чтобы запретитьOut of Thin Airзначения.Slide 89/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


OoTA: ...Land of Mordor where the Shadows lieИсполнения, которые прошливсе проверки модели,теперь могут использоватьсядля получениявозможных результатовпрограммы.Если исполнение не проходитхотя бы через одинфильтр, то мы можем егосразу отбросить.Slide 90/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


FinalsSlide 91/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: QuizЧто напечатает?class A {int f;A() { f = 42; }}A a;a = new A();if (a != null)println(a.f);Slide 92/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: QuizЧто напечатает?class A {int f;A() { f = 42; }}A a;a = new A();if (a != null)println(a.f);, 0, 42, или бросит NPE.Slide 92/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: Quiz«Правильно» не бросит NPE:class A {int f;A() { f = 42; }}A a;a = new A(); A ta = a;if (ta != null)println(ta.f);Slide 93/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: СказкаХотелось бы получить только 42:class A {????? int f;A() { f = 42; }}A a;a = new A(); A ta = a;if (ta != null)println(ta.f);Slide 94/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: СказкаХочется иметь объекты,которые можно безопасно публиковать через гонки...чтобы не платить за «лишние» synchronization actions...чтобы не нарушить security, если какой-нибудь(злонамеренный) дурак наш защищённый объектопубликовал через гонкуSlide 95/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: БыльСпекуляция приводит к дефолтам и кризисам.Но совсем сажать за спекуляцию нельзя,ибо она приносит профит.Способ точечно сломать спекуляцию: никогда не показыватьнеполные объекты: тогда неоткуда ни рантайму, ни железу,ни чёрту в ступе взять левое значение...естественный способ поддержать в языке – новыеобъекты, ибо про них ничего не известно...включать магическим словом final: если пользователихотят иного, не ставят finalSlide 96/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: РешениеВ конце конструктора происходит freeze actionFreeze action «замораживает» поляЕсли поток прочитал ссылку на объект, то он увидитзамороженные значенияЕсли поток прочитал из final-поля ссылку на другойобъект, то состояние того как минимум настолько жесвежее, как и на время freeze’аSlide 97/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: Формальноw −→ hbF −→ hba −−→ mcr1 −→ drr2 ,w – запись целевого поля, F – freeze action, a – действие,прочитавшее ссылку на объект, r1 – чтение final-поля, r2 –чтение целевого поляВводятся два новых частичных порядка:dereference order (dr) (цепочки доступа внутри потока)memory order (mc) (цепочки публикации между потоками)Slide 98/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: Формальноw −→ hbF −→ hba −−→ mcr1 −→ drr2 ,w – запись целевого поля, F – freeze action, a – действие,прочитавшее ссылку на объект, r1 – чтение final-поля, r2 –чтение целевого поляЕсли единственный путь через −→ drи −−→ mcдо записи поля лежитчерез F , то можем увидеть только замороженное значение, ура!А если есть другие пути...Slide 98/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: Пример 11Thread 1T l = new T() {{fx = 42; w}}; fGLOBAL = l; aThread 2T o = GLOBAL ; r0if (o != null ) {int result = o.fx; r1 r2}Возможно ли в result получить 0?11 Цельнотянут у Владимира Ситникова и Валентина КоваленкоSlide 99/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: Пример 11hbT l = new T() {{fx = 42; w}}; f hbGLOBAL = l; aThread 1Thread 2T o = GLOBAL ; r0if (o != null ) {int result = o.fx; r1 r2}Действия в одном потоке образуют happens-before:whb−→ f, fhb−→ a11 Цельнотянут у Владимира Ситникова и Валентина КоваленкоSlide 99/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: Пример 11hbT l = new T() {{fx = 42; w}}; f hbGLOBAL = l; aThread 1mcThread 2T o = GLOBAL ; r0if (o != null ) {int result = o.fx; r1 r2}r0 видит запись a:a −−→ mcr011 Цельнотянут у Владимира Ситникова и Валентина КоваленкоSlide 99/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: Пример 11hbT l = new T() {{fx = 42; w}}; f hbGLOBAL = l; aThread 1mcThread 2T o = GLOBAL ; r0if (o != null ) {int result = o.fx; r1 r2}drПоток 2 не создавал объект, r1 читает его поле, а r этоединственное чтение адреса объекта, поэтому dereference chain:r0 dr−→ r111 Цельнотянут у Владимира Ситникова и Валентина КоваленкоSlide 99/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: Пример 11hbT l = new T() {{fx = 42; w}}; f hbGLOBAL = l; aThread 1mcT o = GLOBAL ; r0if (o != null ) {}Thread 2mcint result = o.fx; r1 r2drr0 dr−→ r1 ⇒ r0 mc−−→ r111 Цельнотянут у Владимира Ситникова и Валентина КоваленкоSlide 99/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: Пример 11mchbT l = new T() {{fx = 42; w}}; f hbGLOBAL = l; aThread 1mcT o = GLOBAL ; r0if (o != null ) {}Thread 2mcint result = o.fx; r1 r2a mc−−→ r1 ( mc−−→ транзитивно)11 Цельнотянут у Владимира Ситникова и Валентина КоваленкоSlide 99/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: Пример 11hbT l = new T() {{fx = 42; w}}; f hbGLOBAL = l; aThread 1mcThread 2T o = GLOBAL ; r0if (o != null ) {int result = o.fx; r1 r2}drВозьмём r2 = r1, тогда r1 dr−→ r2 ( dr−→ рефлексивно)11 Цельнотянут у Владимира Ситникова и Валентина КоваленкоSlide 99/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: Пример 11hbT l = new T() {{fx = 42; w}}; f hbGLOBAL = l; aThread 1mcThread 2T o = GLOBAL ; r0if (o != null ) {int result = o.fx; r1 r2}hb*drwНашли всё необходимое для HB * :hb−→ f−→ hba −−→ mcr1 −→ drr2 ⇒ whb−→ r211 Цельнотянут у Владимира Ситникова и Валентина КоваленкоSlide 99/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: Пример 11hbT l = new T() {{fx = 42; w}}; f hbGLOBAL = l; aThread 1mcThread 2T o = GLOBAL ; r0if (o != null ) {int result = o.fx; r1 r2}hb*dr(whb−→ r2) ⇒ r ∈ {42}11 Цельнотянут у Владимира Ситникова и Валентина КоваленкоSlide 99/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: ЗасадыГарантии на замороженностьпропадают при преждевременной публикации:T p, q;T t1 = T t2 = p T t4 = qt1.f = 42 r2 = t2.f r4 = t4.fp = t1 T t3 = q r3 = t3.fq = t1r4 ∈ {42};но r2, r3 ∈ {0, 42}, ибо p «утёк»Slide 100/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: ПрагматикаДать оптимизациям мега-свободу по кешированию final-ов«All references are created equal»: локальный оптимизатор неперегружен анализом ссылокКак только оптимизатор увидел опубликованную ссылку, онможет скэшировать все его final поля, и баста!Т.е. если оптимизатор увидел недоконструированныйобъект, то ханаSlide 101/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: РеализацияДовольно просто реализовать на большинстве платформДостаточно запретить переупорядочивание инициализацииfinal-полей и публикации объекта на большинствеархитектурВсе известные промышленные архитектуры 12 непереупорядочивают загрузку объекта, и загрузку поля изнего (dependent loads)12 кроме Alpha, но она отправилась к праотцам, куда ей и дорогаSlide 102/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: QuizЧто напечатает?class A {final int f;{ f = 42; }}A a;a = new A(); A ta = a;if (ta != null)println(ta.f);Slide 103/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: QuizЧто напечатает?class A {final int f;{ f = 42; }}A a;a = new A(); A ta = a;if (ta != null)println(ta.f);Конечно, 42.Slide 103/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: JMM 9Текущая спецификация плохо относится к не-final-полямЕсли поле записано в конструкторе, и никогда немодифицируется? (e.g. юзер прошляпил final на поле)Если поле уже volatile? (e.g. AtomicInteger)Если объект строится билдерами? (lazy lists?)Вопрос: не стоит ли дать гарантии на инициализацию длявсех полей и всех конструкторов?Slide 104/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: JMM 9https://github.com/shipilev/<strong>jmm</strong>-benchmarks/2x12x2 Xeon E5-2697, 2.70GHz;OEL 6, JDK 8b121, x86_641x4x1 Cortex-A9, 1.7 GHz;Linaro 12.11, JDK 8b121, SEEmbeddedИзмеряем не производительностьспеки, а производительностьнекоторой её реализацииSlide 105/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: JMM 9https://github.com/shipilev/<strong>jmm</strong>-benchmarks/2x12x2 Xeon E5-2697, 2.70GHz;OEL 6, JDK 8b121, x86_641x4x1 Cortex-A9, 1.7 GHz;Linaro 12.11, JDK 8b121, SEEmbeddedИзмеряем не производительностьспеки, а производительностьнекоторой её реализацииSlide 105/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: JMM 9: Initialization (chained)@GenerateMicroBenchmarkpublic Object test () {return new Test_ [N](v);}// chained caseclass Test_ [N] extends Test_ [N -1] {private [ plain | final ] int i_[N];public ( int v) {super (v);i_[N] = v;}}Slide 106/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: JMM 9: Initialization (merged)@GenerateMicroBenchmarkpublic Object test () {return new Test_ [N](v);}// merged caseclass Test_ [N] {private [ plain | final ] int i_1 , ... , i_[N];public ( int v) {i_1 = i_2 = ... = i_[N] = v;}}Slide 107/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: JMM 9: Результаты (x86)На Total Store Order это вообще бесплатно: 1313 http://shipilev.net/blog/2014/all-fields-are-final/Slide 108/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Finals: JMM 9: Результаты (ARMv7)На weakly-ordered архитектурах нужно клеить барьеры: 1414 http://shipilev.net/blog/2014/all-fields-are-final/Slide 109/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


ЗаключениеSlide 110/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Заключение: Lingua Latina...«The best way is to build up a small repertoire of constructions thatyou know the answers for and then never think about the JMM rulesagain unless you are forced to do so! Literally nobody likes figuringthings out from the JMM rules as stated, or can even routinely do socorrectly. This is one of the many reasons we need to overhaul JMMsomeday.»Slide 111/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Заключение: Lingua Latina...«The best way is to build up a small repertoire of constructions thatyou know the answers for and then never think about the JMM rulesagain unless you are forced to do so! Literally nobody likes figuringthings out from the JMM rules as stated, or can even routinely do socorrectly. This is one of the many reasons we need to overhaul JMMsomeday.»(Doug Lea, private communication, 2013)Slide 111/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Заключение: Известные проблемыJSR 133 Cookbook не содержит некоторыхмашинно-специфичных особенностей, обнаруженных многопозднее создания текущей JMMНекоторые новые примитивы в библиотеке вообще неспецифицируемы в текущей модели (e.g. lazySet,weakCompareAndSet)JMM специфицирована для Java, что делать с JVM-basedязыками?В формальной спецификации JMM есть формальныенеточности, которые ставят раком автоматическиеверификаторыSlide 112/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Заключение: JMM Overhaul«Java Memory Model update»http://openjdk.java.net/jeps/188Improved formalizationJVM languages coverageExtended scope for existing unspec-ed primitivesC11/C++11 compatibilityTesting supportTool supportSlide 113/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Заключение: ЧтениеSlide 114/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Заключение: ЧтениеGoetz et al, «Java Concurrency in Practice»Herilhy, Shavit, «The Art of Multiprocessor Programming»Adve, «Shared Memory Models: A Tutorial»McKenney,«Is Parallel Programming Hard, And, If So, WhatCan You Do About It?»Manson, «Java Memory Model» (Special PoPL issue)Huisman, Petri, «JMM: The Formal Explanation»Slide 115/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Q/ASlide 116/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


BackupSlide 117/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Backup: ActionsAction: A =< t, k, v, u >t – the thread performing the actionk – the kind of actionv – the variable or monitor involved in the actionu – an arbitrary unique identifier for the actionSlide 118/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.


Backup: ExecutionsExecution: E =< P, A, −→, po−→, soW, V, −→, sw−→>hbP – program; A – set of program actionspo−→ – program order;so−→ – synchronization ordersw−→ – synchronizes-with orderhb−→ – happens-before orderW (r) – «write seen function», answers what write the readobserves; V (r) – answers what value the read observesSlide 119/119. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!