Проблема реализации протокола отслеживания MESI - PullRequest
0 голосов
/ 09 февраля 2019

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

1 Ответ

0 голосов
/ 15 февраля 2019

Два ядра должны договориться друг с другом для обновления.Вы можете сделать это с помощью протокола Snoopy или каталога.Таким образом, в вашем примере кеши не могут изменить свое состояние, а просят об изменении.Кто бы ни выиграл арбитраж, он может измениться на измененный, в то время как другой признается недействительным.

Эти слайды , кажется, суммируют это довольно хорошо.Вы хотите взглянуть на слайд 20 для протокола Snoopy в качестве примера.

...