Lightning talk on Java Memory Consistency Model Java Day Kiev 2014

Preview:

DESCRIPTION

Brief introduction into what Memory Model is about and why it matters and when. Explanation why it was changed in Tiger and how. Also informs where to look for more and offers definition. I've gave this talk at PJUG and Java Day Kiev in 2014.

Citation preview

@LAFK_pl, Polish JUG, May 2014 2

@LAFK_pl, Polish JUG, May 2014 3

MANAGEMENT!!

@LAFK_pl, Polish JUG, May 2014 4

Posted in 2012...

@LAFK_pl, Polish JUG, May 2014 5

... and still not corrected

@LAFK_pl, Polish JUG, May 2014 6

Leslie Lamport

● Distributed system clocks

● Happens-before

● Sequential Consistency

@LAFK_pl, Polish JUG, May 2014 7

Bill Pugh

● FindBugs

● Java Memory Model is broken● Final - Volatile● Double-checked

locking

● New JMM

@LAFK_pl, Polish JUG, May 2014 8

Sarita Adve

● Java Memory Model is broken

● Number of great papers on memory (consistency) models

● Best definition of MCM I found

@LAFK_pl, Polish JUG, May 2014 9

Within these 15-20 minutes

Intro

Memory model means?

Hardware

Java stuff

@LAFK_pl, Polish JUG, May 2014 10

Memory model?

If NOT about GC then...

what's it about?

@LAFK_pl, Polish JUG, May 2014 11

Memory CONSISTENCY

● Allowed optimizations● Possible behaviours / executions of a (possibly

multithreaded!) program● Which cores / threads see which values● How to make it consistent for us, programmers

@LAFK_pl, Polish JUG, May 2014 12

@LAFK_pl, Polish JUG, May 2014 13

@LAFK_pl, Polish JUG, May 2014 14

Where it matters?

● Javac / Jython / ...● JIT

● Hardware of course

● So JMM is a LANGUAGE memory consistency model

@LAFK_pl, Polish JUG, May 2014 15

Hardware

● CISC or RISC CPU● Number of registers● Caches size or type● How many functional units per CPU● Pipeline:

● Instruction decode > address decode > memory fetch > register fetch > compute ...

@LAFK_pl, Polish JUG, May 2014 16

Program / code optimizations?

● Reorder ● (e.g. prescient store)

● Remove what's unnecessary ● (e.g. synchronize)

● Replace instructions / shorten machine code● Function optimizations

● (e.g. Inlining)

● ...

@LAFK_pl, Polish JUG, May 2014 17

Exemplary CPU

@LAFK_pl, Polish JUG, May 2014 18

Barriers / fences

„once memory has been pushed to the cache then a protocol of messages will occur to ensure all caches are coherent for any shared data. The techniques for making memory visible from a processor core are known as memory barriers or fences.

– Martin Thompson, Mechanical Sympathy

differs per architecture / CPU / cache type!

@LAFK_pl, Polish JUG, May 2014 19

Barriers / Fences

● CPU instruction● Means „Flush now!”

● Forces update● Starts cache

coherency protocols

● Read / Write / Full

@LAFK_pl, Polish JUG, May 2014 20

@LAFK_pl, Polish JUG, May 2014 21

Summarizing Java Language Spec:

● Describes whether the execution trace is a legal execution of the program

● Works by examining each read and checking write observed by that read

● Write is valid when it follows certain rules● Describes possible behaviours of the program

● Implementor adhering to above can optimize code as he likes

@LAFK_pl, Polish JUG, May 2014 22

What rules?

● Write is valid when it follows certain rules

@LAFK_pl, Polish JUG, May 2014 23

Before, or after?

@LAFK_pl, Polish JUG, May 2014 24

Before, or after?

@LAFK_pl, Polish JUG, May 2014 25

JSR-133 = new JM(C)M

@LAFK_pl, Polish JUG, May 2014 26

Class Reordering { int x = 0, y = 0; public void writer() { x = 1; y = 2; }

public void reader() { int r1 = y; // HERE: y == 2 => x == ? int r2 = x; }}

Reordering - classic example

@LAFK_pl, Polish JUG, May 2014 27

What was wrong with old JM(C)M?

You took a look, read the specs entire and...

@LAFK_pl, Polish JUG, May 2014 28

@LAFK_pl, Polish JUG, May 2014 29

New Java Memory Model● SC on single-core and single-thread CPU is

fine but it doesn't cut it now● To ensure visibility, JVM JMM spec ensures:

● final ● volatile ● synchronized

are done well this time

@LAFK_pl, Polish JUG, May 2014 30

Barriers in Java – rules

● JMM● volatile – sfence after write, lfence before read

● final – sfence after init (field visibility)

● Atomic instructions (like lock) = mfence

@LAFK_pl, Polish JUG, May 2014 31

Further topics

● Why MCM and not a threading library? H.Boehm

● Better MCM? Sarita Adve● Possible optimizations and their gains● Performance of Java and hardware MCMs?

Clashes?● JMCM rules in more detail