Очищается ли кеш процессора при переключении контекста в многоядерном режиме?

Недавно я обсуждал, почему на seq в демонстрации Java Actors

@volatile private var seq = 0L
private def nextSeq: Long = {
  val next = seq
  seq += 1
  next
}

Один из ответов заключался в том, что потоки могут быть перенесены, а переменные потеряны (другие ядра будут иметь несогласованные значения в своих частных кэшах). Но обычно вы не отмечаете каждую переменную знаком volatile, чтобы включить многоядерное выполнение. Таким образом, ядра должны очищать кеши при каждом переключении контекста. Но я нигде не могу найти это утверждение явно произнесенным. Всем, например. Википедия, заботятся только о регистрах и стековой памяти

Состояние процесса включает в себя все регистры, которые может использовать процесс, особенно счетчик программ, а также любые другие данные, специфичные для операционной системы, которые могут потребоваться. Эти данные обычно хранятся в структуре данных, называемой блоком управления процессом (PCB) или коммутационным фреймом. Чтобы переключить процессы, необходимо создать и сохранить печатную плату для первого процесса. Печатные платы иногда хранятся в стеке каждого процесса в памяти ядра (в отличие от стека вызовов пользовательского режима), или для этой информации может быть определенная структура данных, определенная операционной системой.

Что у нас есть в действительности относительно миграции данных / переменных общего назначения?


person Val    schedule 11.06.2015    source источник
comment
Механизмы согласования кеша обычно означают, что нет необходимости очищать кеш. .   -  person Damien_The_Unbeliever    schedule 11.06.2015
comment
Спасибо. Возможно, кто-нибудь сможет объяснить, как согласованность кэша связана с миграцией потоков.   -  person Val    schedule 11.06.2015
comment
Всякий раз, когда происходит какое-либо переключение контекста, ОС будет сохранять свое состояние, чтобы ее можно было снова перезапустить на любом ядре (при условии, что она не была привязана к конкретному ядру с помощью функции привязки процессора).   -  person Olof Forshell    schedule 21.06.2015


Ответы (1)


Всякий раз, когда происходит какое-либо переключение контекста, ОС сохраняет свое состояние, чтобы ее можно было снова перезапустить на любом ядре (при условии, что она не была привязана к конкретному ядру с помощью функции привязки процессора).

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

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

person Olof Forshell    schedule 21.06.2015