- Насколько я знаю, атомарная инструкция гарантирует, что когда она выполняется, никакие другие потоки не могут изменить эти данные (как критический раздел). Я прав?
- Как это реализовано в оборудовании?
- Как оборудование гарантирует это? (Аппаратная часть генерирует три микро инструкции внутри: разблокировать, изменить и заблокировать?)
- В чем разница между использованием мьютекса и атомарной инструкции? Разница только в количестве инструкций (1 инструкция для атомарных, несколько инструкций для нормального мьютекса)?
- Разве это количество различий в инструкциях (1 против многих) гарантирует правильность (например, использование мьютекса) и согласованность?
2 ответа
Детали сложны; в одном процессоре достаточно просто реализовать некоторый эквивалент «блокировки, изменения, разблокировки» на уровне микрокода или других методов.
Когда у вас есть несколько процессоров, тема становится сложной, особенно с учетом эффектов кэша. Такие протоколы, как MSI и производные MESI, MOSI, MOESI, подтверждают это в современных процессорах Intel.
В WikiPedia также есть хорошее резюме в Cache Coherence .
Что касается мьютекса против атомарной инструкции: мьютекс - это, более или менее, соглашение о том, что один бит памяти будет использоваться для атомного разрешения одному-единственному человеку установить его в определенное состояние. Это означает, что он может использовать атомарные операции для защиты неатомарных операций - протокол, согласованный обеими сторонами, чтобы притвориться, что вы можете быть атомарными в большем масштабе, чем вы действительно можете.
На большинстве современных процессоров атомарная операция работает, блокируя адрес уязвимой памяти в кеше процессора. Процессор получает адрес памяти исключительно в своем кеше, а затем не позволяет любому другому процессору получать или совместно использовать этот адрес до завершения операции.