Bariery pamięci i TLB

Bariery pamięci gwarantują, że pamięć podręczna danych będzie spójna. Czy jednak gwarantuje, że TLB będzie spójne?

Widzę problem, w którym JVM (java 7 update 1) czasami zawiesza się z błędami pamięci (SIGBUS, SIGSEG) podczas przekazywania MappedByteBuffer między wątkami.

Np.

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);

Bez wątku.yield () czasami dostaję awarie w force (), put () I C ' S memcpy () wszystko wskazuje na to, że próbuję nielegalnie uzyskać dostęp do pamięci. Z Nić.yield () nie miałem problemu, ale to nie brzmi jak niezawodne rozwiązanie.

Czy ktoś zetknął się z tym problemem? Czy są jakieś gwarancje dotyczące TLB i barier pamięci?

EDIT: OS to Centos 5.7, widziałem zachowanie na maszynach i7 i Dual Xeon.

Dlaczego to robię? Ponieważ średni czas na napisanie wiadomości wynosi 35-100 ns w zależności od długości, a użycie funkcji plain write() nie jest tak szybkie. Jeśli pamięć map i oczyścić w bieżącym wątku zajmuje to 50-130 mikrosekund, użycie wątku tła do zrobienia zajmuje około 3-5 mikrosekund, aby główny wątek zamienił bufory. Dlaczego w ogóle muszę wymieniać bufory? Ponieważ piszę wiele GB danych i ByteBuffer nie może mieć rozmiaru 2+ GB.
Author: Rob Kielty, 2011-11-30

1 answers

Mapowanie odbywa się za pomocą mmap64 (FileChannel.Mapa). Gdy adres jest dostępny, nastąpi Błąd strony i jądro będzie tam odczytywać/zapisywać dla Ciebie. TLB nie musi być aktualizowany podczas mmap.

TLB (ze wszystkich procesorów) nie jest walidowany podczas munmap, który jest obsługiwany przez finalizację MappedByteBuffer, stąd munmap jest kosztowny.

Mapowanie wymaga dużej synchronizacji, więc wartość adresu nie może być uszkodzona.

Jakaś szansa, że spróbujesz fantazyjnych rzeczy przez Niebezpieczne?

 12
Author: bestsss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-30 17:00:42