java centos memory-mapped-files tlb memory-barriers

java - Las barreras de la memoria y la TLB.



centos memory-mapped-files (1)

La asignación se realiza a través de mmap64 (FileChannel.map). Cuando se acceda a la dirección, habrá un error de página y el kernel leerá / escribirá allí para usted. TLB no necesita actualizarse durante el mmap.

TLB (de todos los CPU) no está validado durante munmap, que se maneja con la finalización del MappedByteBuffer, por lo que munmap es costoso.

La asignación implica una gran cantidad de sincronización, por lo que el valor de la dirección no se corromperá.

¿Alguna posibilidad de que intentes cosas de lujo a través de inseguro?

Las barreras de memoria garantizan que el caché de datos sea consistente. Sin embargo, ¿garantiza que el TLB será consistente?

Estoy viendo un problema donde la JVM (actualización de Java 7 1) a veces se bloquea con errores de memoria (SIGBUS, SIGSEG) al pasar un MappedByteBuffer entre los hilos.

p.ej

final AtomicReference<MappedByteBuffer> mbbQueue = new AtomicReference<>(); // in a background thread. MappedByteBuffer map = raf.map(MapMode.READ_WRITE, offset, allocationSize); Thread.yield(); while (!inQueue.compareAndSet(null, map)); // the main thread. (more than 10x faster than using map() in the same thread) MappedByteBuffer mbb = inQueue.getAndSet(null);

Sin el Thread.yield () ocasionalmente obtengo bloqueos en force (), put () y memcpy () de C, lo que indica que estoy intentando acceder a la memoria de forma ilegal. Con Thread.yield () no he tenido ningún problema, pero eso no suena como una solución confiable.

¿Ha tenido alguien este problema? ¿Hay alguna garantía sobre las barreras de memoria y TLB?

EDITAR: El sistema operativo es Centos 5.7, he visto el comportamiento en máquinas i7 y Dual Xeon.

¿Por qué hago esto? Debido a que el tiempo promedio para escribir un mensaje es de 35-100 ns dependiendo de la longitud y el uso de un simple write () no es tan rápido. Si recuerdo y mapeo la memoria en el hilo actual, esto toma 50-130 microsegundos, usar un hilo de fondo para hacerlo toma alrededor de 3-5 microsegundos para que el hilo principal intercambie los búferes. ¿Por qué necesito estar intercambiando buffers? Porque estoy escribiendo muchos GB de datos y ByteBuffer no puede tener un tamaño de 2+ GB.