Проблема реализации протокола отслеживания MESI
У меня есть вопрос протокола MESI. Предположим, что у меня есть два ядра (ядро 1 и 2), и каждое ядро имеет свой собственный кэш l2. Когда два ядра имеют одинаковые данные и строки кэша находятся в состоянии S, это означает, что они оба имеют чистые и одинаковые данные. В момент времени t=0 ядро 1 записывает строку кэша, а ядро 1 переключается в M (измененное), а ядро 2 в конечном итоге будет в состоянии I (недействительно). В физическом мире для завершения этой транзакции требуется время. Допустим, что кэш 2 знает, что кэш 1 обновил строку кеша за 5 секунд.
Предположим, что при t = 2 ядро 2 записывает ту же строку кэша и переключается в состояние М. Это действие записи от ядра 2 будет сообщено ядру 1 в момент времени t=7 (2+5). Затем ядро 2 должно аннулировать кэш 2 в момент времени t=5, а ядро 1 аннулирует строку в момент времени t=7. Теперь обе строки становятся недействительными, и данные, записанные ядром 1, а затем ядром 2, теряются. Это явно не соответствует протоколу. Что не так с моей логикой и как предотвратить эту чушь?
1 ответ
Два ядра должны договориться друг с другом, чтобы обновить. Вы можете сделать это с помощью протокола Snoopy или каталога. Таким образом, в вашем примере кеши не могут изменить свое состояние, а просят об изменении. Тот, кто затем выигрывает арбитраж, может измениться на модифицированный, в то время как другой признается недействительным.
Эти слайды, кажется, суммируют это довольно хорошо. Вы хотите посмотреть на слайд 20 для протокола Snoopy в качестве примера.