powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / before-happens в JVM
9 сообщений из 34, страница 2 из 2
before-happens в JVM
    #37974044
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovразмещение volatile-переменной в регистре создаёт проблемную точку на единственном однопоточном процессоре.
Почему?
...
Рейтинг: 0 / 0
before-happens в JVM
    #37974076
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczПочему?Потому, что переключение задач (передача управления другому потоку того же самого процесса) может произойти в любой момент.
Семантика volatile: "Значение данной переменной может измениться в произвольный момент и это не управляется кодом потока".
Если оставаться в рамках x86 и персоналок, то в цепочке типа:
Код: asm
1.
2.
move ax,[var]
adc ax, value
move [var]
значение переменной могло измениться, пока мы работали с регистром.
Такое изменение может быть и "непринципиально" и "ошибка".
Поэтому начинаются варианты - то ли критические секции создавать (дорого, если код короткий), то ли отказаться от регистровой оптимизации, то ли забить :)
...
Рейтинг: 0 / 0
before-happens в JVM
    #37974101
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovПотому, что переключение задач (передача управления другому потоку того же самого процесса) может произойти в любой момент.
Семантика volatile: "Значение данной переменной может измениться в произвольный момент и это не управляется кодом потока".
Если оставаться в рамках x86 и персоналок, то значение переменной могло измениться, пока мы работали с регистром.
Такое изменение может быть и "непринципиально" и "ошибка".
Поэтому начинаются варианты - то ли критические секции создавать (дорого, если код короткий), то ли отказаться от регистровой оптимизации, то ли забить :)
По-моему современные процессоры это нечто большее чем запись-чтение в реестр отдельными командами.
Не про Java, но все же
http://softwareramblings.com/2008/05/demystifying-the-volatile-keyword.html Common myths about the volatile keyword:
A volatile variable will never reside in cache memory – e.g. within the L2 cache of a processor. This is not true. In the case where the volatile variable is shared between two software threads, it is highly likely that the variable will exist in cached memory and the cache coherency policy will ensure that the threads will see the correct and up-to-date value of the variable in the event that the threads are running on seperate cores that don’t share the same cache. When the volatile variable refers to a hardware register, it is likely that the memory map of the system will be setup such that this register is not cacheable in the processor cache, but this is setup and managed by the appropriate device driver and is not something that is provided by the volatile keyword.

я не вижу каких либо препядствий тому чтобы разместить volatile переменную на CPU и использовать его собственные механизмы кеширования и синхронизации между потоками. Это, конечно, не совсем реестр. Но и не RAM, где фактически хранится общее значение.
...
Рейтинг: 0 / 0
before-happens в JVM
    #37974155
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

Хотя, ваша правда в том что реестр это не CPU-кэш и там нет механизмов инвалидации, поэтому именно через реестр volatile реализовать, похоже, нельзя.
...
Рейтинг: 0 / 0
before-happens в JVM
    #37974158
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczя не вижу каких либо препядствий тому чтобы разместить volatile переменную на CPU и использовать его собственные механизмы кеширования и синхронизации между потоками.Процитированное никак не противоречит тому, что я сказал о семантике volatile.
Отслеживание адресов и сквозная запись - всего лишь механизмы, делающие принципиально возможной синхронизацию потоков, исполняющихся на разных ядрах или даже "кристаллах".

P.S. Я напомню, что при отложенной записи некоторые изменения могут вообще "не попасть" на адресную шину.
...
Рейтинг: 0 / 0
before-happens в JVM
    #37975240
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczя не вижу каких либо препядствий тому чтобы разместить volatile переменную на CPU и использовать его собственные механизмы кеширования и синхронизации между потоками. Это, конечно, не совсем реестр. Но и не RAM, где фактически хранится общее значение.
Если вкладывать в понятие volatile какое-то своё значение то может быть, может быть. Однако в JMM запись volatile связанна отношением happens-before с чтением volatile и поэтому просто одну переменную синхронизировать между потоками недостаточно, чтобы удовлетворять happens-before нужно синхронизировать весь кеш.
...
Рейтинг: 0 / 0
before-happens в JVM
    #37975514
rrrrrrrr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю в таком сложном вопросе лучше обратиться к первоисточнику:

1. Пишем пример с volatile
2. Ставим hotspot disassembler: https://wikis.oracle.com/display/HotSpotInternals/PrintAssembly
3. Пускаем пример, смотрим чего нагенерил jit
4. Смотрим чего какая инструкция делает: http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

Ещё в сорцах openjdk много комментариев, можно попробовать там раскопать.
...
Рейтинг: 0 / 0
before-happens в JVM
    #37975795
eextrasens
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rrrrrrrr,

О хорошая мысль, спасибо.
Только что такое MEMBER и FENCES из асм кода вряд ли станет понятно
...
Рейтинг: 0 / 0
before-happens в JVM
    #37976562
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
9 сообщений из 34, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / before-happens в JVM
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]