Недавно я обсуждал, почему на seq в демонстрации Java Actors
@volatile private var seq = 0L
private def nextSeq: Long = {
val next = seq
seq += 1
next
}
Один из ответов заключался в том, что потоки могут быть перенесены, а переменные потеряны (другие ядра будут иметь несогласованные значения в своих частных кэшах). Но обычно вы не отмечаете каждую переменную знаком volatile
, чтобы включить многоядерное выполнение. Таким образом, ядра должны очищать кеши при каждом переключении контекста. Но я нигде не могу найти это утверждение явно произнесенным. Всем, например. Википедия, заботятся только о регистрах и стековой памяти
Состояние процесса включает в себя все регистры, которые может использовать процесс, особенно счетчик программ, а также любые другие данные, специфичные для операционной системы, которые могут потребоваться. Эти данные обычно хранятся в структуре данных, называемой блоком управления процессом (PCB) или коммутационным фреймом. Чтобы переключить процессы, необходимо создать и сохранить печатную плату для первого процесса. Печатные платы иногда хранятся в стеке каждого процесса в памяти ядра (в отличие от стека вызовов пользовательского режима), или для этой информации может быть определенная структура данных, определенная операционной системой.
Что у нас есть в действительности относительно миграции данных / переменных общего назначения?