Запишите реакцию буфера на сообщения, вызванные MESI

Предположим, у нас следующая ситуация: 2 ЦП с буферами записи и MESI используется в качестве протокола когерентности кэша. И у нас есть одна строка общего кэша между процессорами:

CPU1 кеш: |I|I|S|I|I|

CPU2 кеш: |I|I|S|I|I|

Теперь CPU1 решает изменить общую линию. Он помещает запись изменений в свой буфер записи и отправляет сообщение о недействительности в CPU2. CPU2 получает его и отправляет подтверждение:

CPU1 кеш: |I|I|S|I|I|, CPU1 буфер записи: change for the 3rd cache line

CPU2 кеш: |I|I|I|I|I|

Правильно ли, что при получении подтверждения CPU1 не должен очищать буфер записи и изменять состояние строки кэша на M(изменено)? Если нет, то давайте идти дальше.

Предположим, теперь CPU2 хочет снова прочитать эту строку кэша. Если Snooping CPU1 перехватит этот запрос на чтение, и flush buffer->flush cache line->send the last value of the cache line to CPU2? Или он может игнорировать его, и CPU2 по-прежнему будет иметь старое значение, запрашивая ОЗУ (которое еще не было изменено)?

1 ответ

Решение

В стандартном протоколе MESI нет подтверждения недействительных транзакций. В вашем примере строка кэша переходит в состояние M в CPU1, и запись удаляется из буфера записи.

Когда CPU2 выполняет чтение, CPU1 записывает измененную строку в память. CPU2 может получить значение либо из CPU1, либо из памяти (только после завершения записи CPU1). Запись в память необходима, потому что там нет состояния O (Owned).

Существуют протоколы, такие как протокол Dragon, которые используют сигнал, чтобы указать, является ли линия кэша общей или нет.

Другие вопросы по тегам