Третья разновидность — сквозное кэширование с заполнением по записи. Здесь при промахе при записи, записываемое слово записывается не только в основную, но и в кэш-память.
Сквозное кэширование во всех его разновидностях просто реализуется, но недостаточно эффективно. Каждая операция записи должна передаваться по общей шине в основную память, так что увеличение производительности получается только за счёт операций чтения. Это, снова таки, ограничивает производительность системы пропускной способностью шины, а не быстродействием процессоров. Основное отличие всех остальных протоколов состоит именно в том, что не все операции записи проходят по шине в основную память. Вместо этого при изменении строки кэш-памяти внутри кэш-памяти устанавливается связанный с изменённой строкой бит, который показывает, что строка в кэш-памяти правильная, а в основной памяти — нет. В конечном итоге эта строка записывается в основную память, но записывается тогда, когда шина простаивает без дела, или тогда, когда другой процессор запросил слово из данной строки. Протоколы когерентности кэширования такого типа называются протоколами с обратной записью.
Существует множество протоколов данного типа. Один из них — MESI — используется в процессорах Pentium II. Каждая строка кэш-памяти может находиться в одном из четырёх состояний:
Modified — элемент действителен, основная память недействительна, копий элемента не существует.
Exclusive — элемент действителен, основная память обновлена, других копий элемента не существует.
Shared — элемент действителен, основная память обновлена, возможно существование копий элемента в других КЭШах.
Invalid — элемент недействителен.
При инициализации процессора все строки помечаются как недействительные. При первом считывании из основной памяти нужная строка загружается в кэш-память данного процессора и помечается E. При последующих считываниях процессор использует кэш-память и не трогает шину. Другой процессор может загрузить ту же строку из основной памяти и поместить её в свою кэш-память, но первый держатель копии по шине объявляет, что у него есть дубликат. Оба дубликата помечаются S. При чтении строк S процессор также не трогает шину.
Когда процессор производит запись в строку S, он выдаёт на шину соответствующий сигнал, и все остальные процессоры, имеющие дубликат данной строки, помечают её I. Записавший процессор помечает её в своей кэш-памяти M. Когда процессор производит запись в строку E, никакого сигнала на шину не выдаётся, а строка, снова, помечается M.
Если какой-либо процессор выдаёт на шину запрос на чтение элемента, который попадает в строку, хранящуюся в кэш-памяти другого процессора в состоянии M, второй процессор немедленно выдаёт на шину сигнал и начинает процесс записи запрошенного элемента в основную память. Первый процессор, получив по шине сигнал, ждёт до тех пор, пока операция записи не будет завершена. По завершении операции записи оба процессора помечают строку S.
Если какой-либо процессор выдаёт на шину запрос на запись элемента, который попадает в строку, хранящуюся в кэш-памяти другого процессора в состоянии M, второй процессор всё равно немедленно выдаёт на шину сигнал и начинает процесс записи запрошенного элемента в основную память. Первый процессор, получив по шине сигнал, ждёт до тех пор, пока операция записи не будет завершена. Но, в отличие от предыдущего случая, по завершении операции записи первый процессор тут же помечает строку I, поскольку он знает, что другой процессор собирается изменить её. Второй процессор записывает некэшированную строку. Возможны варианты протокола: с загрузкой записываемой строки в кэш-память (write-allocate), или без таковой. Если использует первый вариант, то загруженная строка помечается M.
При всевозможных оптимизациях использование одной шины ограничивает размер системы тремя десятками процессоров. Чтобы получить несколько больший размер, нужен иной принцип. Этим принципом может быть координатный коммутатор.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.