pc:ideas_diplomatura
(el usuario blanco puede editar, Nico)
Ejemplos Formativos vs. Informativos
Dividir ejemplos en:
- Formativos: se mostrarán y pensarán en detalle
- Informativos: paseo rápido.
Formativos
- BoundedBuffer (aka Productores/Consumidores, aka BoundedCounter)
- Concurrent Vector Writing [Fei99] vs. Hand-over-hand locking [2.5.1.4, Lea99]
Informativos
- Nested monitor
Taller
Investigar
- Inyectar ruido en el scheduler, a través de Thread.yield() o toqueteando la JVM.
- Ver [Goe06, 12.1.6 – Generating More Interleavings]
- Mostrar optimizaciones con algún ejemplo simple (*[ x:=x+1; x:=x-1 ])
javap -c
desensabla bytecode. Listado de los VM Opcodes.-server
en lajre
optimiza más.
- Ver como meter algo de
assert
para los invariantes.- La palabra
assert
está desde JDK 1.4.2. - Algunos compiladores necesitan
-source 1.4
o-source 5.0
para aceptarla. - En la JVM se activa con
java -ea
, ver también-esa
.
- ?Se puede hacer un ejemplo donde se muestre la sincronización de memoria ya sea con
volatile
o consynchronized
? - Ver el sourcecode de la JVM en el scheduler y como maneja el
wait
. - Que hay en java.util.concurrent:
CondVar
sobre todo en Java 6 y Java 5, en Java 1.4.2 no está - Notar que hay opciones muy específicas en la HotSpot JVM como:
-XX:PreBlockSpin=10 Spin count variable for use with -XX:+UseSpinning. Controls the maximum spin iterations allowed before entering operating system thread synchronization code. (Introduced in 1.4.2.) -XX:-UseSpinning Enable naive spinning on Java monitor before entering operating system thread synchronizaton code. (Relevant to 1.4.2 and 5.0 only.) [1.4.2, multi-processor Windows platforms: true]
IncDecStar
Implementar *[ x:=x+1; x:=x-1 ] Deducir el grado de atomicidad de x:=x+1 a partir de si se cumple el invariante 0⇐x⇐2. Es notoria la diferencia entre 1 CPU y 2 CPUs en la riqueza del scheduling. Relacionar esto con el hecho de que el planificador de Java es cooperativo en realidad, o sea no tiene Quanto. Está bueno mostar:
- Como una mala sincronización para hacer incremento atómico falla, por ejemplo
synchronized(this) { }
sincroniza con el mismo objeto thread. - Usar AtomicInteger.
- Mirar la implementación de esto que básicamente usa
compareAndSwapInt
que internamente usasun.misc.Unsafe
, y de esta última no encontre sourcecode . Aparentemente está en los fuentes del SDK que se bajan del sitio “developers”.
- Desensablar con
javap -c
y ver que el incremento está desacoplado. Notar losmonitorenter
,monitorexit
.
36: monitorenter 37: aload_0 38: getfield #15; //Field N:LMyInt; 41: dup 42: getfield #52; //Field MyInt.value:I 45: iconst_1 46: iadd 47: putfield #52; //Field MyInt.value:I 50: aload_1 51: monitorexit
DoubleCheckTest
Bill Pugh, produjo un ejemplo limpio del problema The "Double-Checked Locking is Broken" Declaration.
El problema es que para Java5 no saltan los errores.
Lock-free, wait-free linked lists
- ABA problem. Problema con las arquitecturas de 64bits en ABA Prevention Using Single-Word Instructions. Alguna discusión de problemas de addressing-shrink en las arquitecturas de 64bits: The Old New Thing : Why is the virtual address space 4GB anyway?.
- Ver como es la implementación en
java.util.concurrent
. - Pensar en algo más global con Producer/Consumer.
pc/ideas_diplomatura.txt · Última modificación: 2018/08/10 03:03 por 127.0.0.1