В литературе по протоколу когерентности кэша Write-Once был первым определенным протоколом MESI . Он имеет оптимизацию выполнения сквозной записи при первой записи и обратной записи при всех последующих записях, что снижает общий трафик шины при последовательных записях в память компьютера . Впервые он был описан Джеймсом Р. Гудманом в (1983). [1] Протоколы когерентности кэша являются важной проблемой в симметричных многопроцессорных системах, где каждый ЦП поддерживает кэш памяти.
Штаты
В этом протоколе каждый блок в локальном кэше находится в одном из четырех состояний:
Недопустимо : этот блок имеет несогласованную копию памяти.
Действительный : Этот блок имеет согласованную копию памяти. Данные могут быть, возможно, общими, но их содержимое не изменяется.
Зарезервировано : Блок является единственной копией памяти, но он все еще когерентен. Обратная запись не требуется, если блок заменяется.
Dirty : Блок является единственной копией памяти и является некогерентным. Эта копия была записана один или несколько раз. Это единственное состояние, которое генерирует обратную запись, когда блок заменяется в кэше.
Эти состояния имеют точно такие же значения, как и четыре состояния протокола MESI (они просто перечислены в обратном порядке), но это упрощенная форма, которая избегает операции Read for Ownership. Вместо этого вся недействительность выполняется путем записи в основную память.
Для любой заданной пары кэшей разрешенные состояния заданной строки кэша следующие (сокращенно в указанном выше порядке):
Переходы
Протокол следует некоторым правилам перехода для каждого события:
Удар по чтению : Информация предоставлена текущим кэшем. Состояние не изменилось.
Промах чтения : данные считываются из основной памяти. Чтение отслеживается другими кэшами; если в каком-либо из них строка находится в состоянии Dirty , чтение прерывается на достаточно долгое время, чтобы записать данные обратно в память, прежде чем ему будет разрешено продолжить. Любые копии в состояниях Dirty или Reserved устанавливаются в состояние Valid .
Write hit : Если информация в кэше находится в состоянии Dirty или Reserved , строка кэша обновляется на месте, и ее состояние устанавливается в Dirty без обновления памяти. Если информация находится в состоянии Valid , выполняется операция сквозной записи, обновляющая блок и память, и состояние блока изменяется на Reserved . Другие кэши отслеживают запись и устанавливают свои копии в Invalid .
Write miss : Частичная запись строки кэша обрабатывается как промах чтения (если необходимо извлечь незаписанную часть строки кэша), за которым следует попадание записи. Это оставляет все остальные кэши в состоянии Invalid , а текущий кэш — в состоянии Reserved .
Это вариант протокола MESI, но нет явного чтения для владения или широковещательной операции недействия для помещения строки в кэш в состоянии Exclusive без выполнения записи в основную память. Вместо этого первая запись в строку кэша Valid (также известную как Shared ) выполняет запись через память, что неявно делает другие кэши недействительными. После этого строка находится в состоянии Reserved ( Exclusive ), и дальнейшие записи могут выполняться без ссылки на основную память, оставляя строку кэша в состоянии Dirty ( Modified ).
Ссылки
^ Гудман, Джеймс Р. (1983). «Использование кэш-памяти для уменьшения трафика процессор-память». ACM Sigarch Computer Architecture News . 11 (3): 124–131. doi : 10.1145/1067651.801647 .
Арчибальд, Дж.; Бэр, Дж. Л. (ноябрь 1986 г.). «Протоколы когерентности кэша: оценка с использованием модели многопроцессорной имитации». ACM Trans. Comput. Syst . 4 (4): 273–298. doi :10.1145/6513.6514. S2CID 713808.
Goodman, JR (1983). "Использование кэш-памяти для снижения трафика процессор-память". Труды 10-го ежегодного международного симпозиума по компьютерной архитектуре - ISCA '83 . Международный симпозиум по компьютерной архитектуре: Стокгольм, Швеция, 13–17 июня 1983 г. стр. 124–131. doi :10.1145/800046.801647. ISBN 0-89791-101-6.