Подтвердить что ты не робот

Пункты памяти и TLB

Пункты памяти гарантируют, что кеш данных будет согласован. Однако, это гарантирует, что TLB будет согласован?

Я вижу проблему, когда JVM (обновление java 7 1) иногда с ошибками памяти (SIGBUS, SIGSEG) сбой при передаче MappedByteBuffer между потоками.

например.

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

Без Thread.yield() я иногда получаю сбои в силе(), put() и C memcpy(), все указывает, что я пытаюсь получить доступ к памяти нелегально. С Thread.yield() у меня не было проблемы, но это не похоже на надежное решение.

Кто-нибудь сталкивался с этой проблемой? Существуют ли какие-либо гарантии относительно TLB и барьеров памяти?


EDIT: ОС - Centos 5.7, я видел поведение на i7 и Dual Xeon.

Почему я это делаю? Поскольку среднее время написания сообщения составляет 35-100 нс в зависимости от длины, а использование простой записи() не так быстро. Если карта памяти и очистка в текущем потоке занимает 50-130 микросекунд, то для использования фонового потока требуется около 3-5 микросекунд для основного потока для замены буферов. Зачем мне вообще нужно обменивать буферы? Поскольку я пишу много ГБ данных, а ByteBuffer не может быть размером 2+ ГБ.

4b9b3361

Ответ 1

Отображение выполняется через mmap64 (FileChannel.map). Когда адрес будет доступен, произойдет ошибка страницы, и ядро ​​будет читать/писать там для вас. TLB не нужно обновлять во время mmap.

TLB (всего cpus) не проверяется во время munmap, который обрабатывается завершением MappedByteBuffer, поэтому munmap является дорогостоящим.

Отображение включает в себя большую синхронизацию, поэтому значение адреса не должно быть повреждено.

Есть ли шанс, что вы попробуете причудливые вещи через Unsafe?