Herramientas de usuario

Herramientas del sitio


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 la jre optimiza más.
  • Ver como meter algo de assert para los invariantes.
    • En JUnit hay métodos assertTrue, assertEqual, etc.
    • 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 con synchronized?
  • 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.
    • Mirar la implementación de esto que básicamente usa compareAndSwapInt que internamente usa sun.misc.Unsafe, y de esta última no encontre sourcecode FIXME. 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 los monitorenter, 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. FIXME

Lock-free, wait-free linked lists
pc/ideas_diplomatura.txt · Última modificación: 2018/08/10 03:03 por 127.0.0.1