Запишите реакцию буфера на сообщения, вызванные 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, которые используют сигнал, чтобы указать, является ли линия кэша общей или нет.