Организация ЭВМ и систем: Курс лекций (Позиционные системы счисления. Процессоры семейства IA-32. Лазерные принтеры), страница 41

Если шина занята, процессор ждёт, когда она освободится. При наличии двух процессоров такая архитектура ещё приемлема, при наличии тридцати двух процессоров производительность системы будет полностью ограничиваться пропускной способностью шины, а почти все процессоры будут простаивать почти всё время.

Первый шаг в решении данной проблемы — добавление кэш-памяти к каждому процессору.

Рис. 14.2. Шинная архитектура с кэш-памятью

Кэш-память физически может находиться на одном монокристалле с процессором, в корпусе одной микросхемы или отдельной радиотехнической деталью. Используются комбинации.

Теперь часто используемые процессором данные и код можно хранить в кэш-памяти, нагрузка на шину меньше, и одна шина может обеспечивать большее количество процессоров.

Уже такое небольшое усовершенствование создаёт большие проблемы. Если не принять специальных мер, то такая архитектура не обеспечит даже согласованность по последовательности, не говоря уже о строгой согласованности.

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

Во всех случаях контроллер кэш-памяти устроен так, что он может перехватывать запросы, направляющие от своего процессора к шине, и запросы, передающиеся по шине от других процессоров к памяти. Такие устройства называются кэш-памятью с отслеживанием (snooping cash или snoopy cash), поскольку они отслеживают шину.

Единица передачи и хранения данных в кэш-памяти называется строкой. Обычно строка имеет размер 32 или 64 байт.

Самый простой протокол когерентности кэширования называется сквозным кэшированием. Основная память в данном протоколе всегда содержит «правильное» значение строки.

Принцип действия протокола проще рассмотреть по отдельным случаям, перечисленным в следующей таблице:

Случай

Локальный запрос

Удалённый запрос

Промах при чтении

Вызов данных из памяти

Попадание при чтении

Использование данных из локальной кэш-памяти

Промах при записи

Обновление данных в памяти

Попадание при записи

Обновление кэш-памяти и основной памяти

Удаление элемента кэш-памяти

Если процессор пытается считать слово, которого нет в кэш-памяти — промах при чтении, — контролер кэш-памяти загружает в кэш-память строку, которая содержит требуемое слово. Строку предоставляет основная память, которая всегда обновлена. В дальнейшем данные могут считываться из кэш-памяти (попадание при чтении).

В случае, если процессор пытается записать слово, которого нет в кэш-памяти — промах при записи, — новое слово записывается в основную память. Строка, содержащая нужное слово не загружается в кэш-память.

В случае, если процессор пытается записать слово, которое есть в кэш-памяти — попадание при записи, — значение в кэш-памяти обновляется, и, кроме того, значение записывается в основную память.

Если другой процессор пытается записать данные, то контроллер кэш-памяти нашего процессора проверяет, есть ли в его кэш-памяти дубликат этих данных. Если дубликата нет, он ничего не делает. Если дубликат есть, он удаляется.

Все КЭШи отслеживают все запросы по шине, и всякий раз, когда записывается слово, оно обновляется в кэш-памяти инициатора запроса, если оно там имеется, обновляется в основной памяти и удаляется из всех остальных КЭШей.

Описанная только что разновидность сквозного кэширования называется сквозным кэшированием с удалением или с признанием данных недействительными. Другая разновидность — сквозное кэширование с обновлением. Здесь вместо того, чтобы избавляться от устаревшей строки в кэш-памяти, каждый раз при обновлении слова в основной памяти другим процессором обновляется и строка, содержащая это слово в данной кэш-памяти. Эта разновидность требует большего количества операций при операциях других процессоров, но зато сокращает количество дальнейших промахов.