Протокол MOESI
(Подробное описание см. в разделе Протоколы когерентности кэша (примеры) )
В вычислениях MOESI («Modified Owned Exclusive Shared Invalid») представляет собой протокол полной когерентности кэша , который охватывает все возможные состояния, обычно используемые в других протоколах. В дополнение к четырем общим состояниям протокола MESI , существует пятое состояние «Принадлежность», представляющее данные, которые одновременно изменяются и передаются. Это позволяет избежать необходимости записывать измененные данные обратно в основную память перед их общим доступом. Хотя в конечном итоге данные все равно придется записать обратно, обратная запись может быть отложена.
Чтобы это было возможно, должна быть возможна прямая передача данных из кэша в кэш, чтобы кэш с данными в измененном состоянии мог передавать эти данные другому считывателю, не передавая их в память.
Как обсуждалось в AMD64 Руководстве программиста по архитектуре Vol. 2 « Системное программирование » , [1] каждая строка кэша находится в одном из пяти состояний:
- Модифицированный
- Этот кэш имеет единственную действительную копию строки кэша, и в эту копию были внесены изменения. Кэшированную копию можно свободно изменять.
- В собственности
- Эта строка является одной из нескольких копий в системе. Этот кеш не имеет разрешения на изменение копии , но строка изменяется (грязная) относительно основной памяти, и этот кеш несет исключительную ответственность за обеспечение того, чтобы основная память в конечном итоге обновлялась. Строка кэша может быть переведена в состояние «Изменено» после признания недействительными всех общих копий или переведена в состояние «Общее» путем записи изменений обратно в основную память. Собственные строки кэша должны отвечать на запрос отслеживания данными, чтобы гарантировать, что устаревшая копия в основной памяти не используется.
- Эксклюзивный
- В этом кэше имеется единственная копия строки, но строка чистая (немодифицированная). В него можно записать, переведя его в измененное состояние.
- Общий
- Эта строка является одной из нескольких копий в системе. Этот кэш не имеет разрешения на изменение копии. В отличие от протокола MESI, строка общего кэша может быть «грязной» по отношению к памяти; если да, то один из кэшей имеет копию в состоянии «Владеет», и этот кэш отвечает за окончательное обновление основной памяти. Если ни один кэш не содержит строку в состоянии «Владеет», копия памяти актуальна. Строку кэша нельзя записывать, но сначала ее необходимо перевести в состояние «Исключительно» или «Изменено», сделав недействительными все остальные кэшированные копии. (Если строка кэша ранее была «Владеющей», ответ на недействительность укажет на это, и состояние станет «Изменено», поэтому обязательство в конечном итоге записать данные обратно в память не забывается.) Ее также можно отбросить (перевести в недействительное состояние). ) в любое время.
- Неверный
- Этот блок недействителен; его необходимо получить, чтобы удовлетворить любую попытку доступа.
Для любой пары кэшей разрешенные состояния данной строки кэша следующие:
М | ТО | И | С | я | |
---|---|---|---|---|---|
М | ![]() |
![]() |
![]() |
![]() |
![]() |
ТО | ![]() |
![]() |
![]() |
![]() |
![]() |
И | ![]() |
![]() |
![]() |
![]() |
![]() |
С | ![]() |
![]() |
![]() |
![]() |
![]() |
я | ![]() |
![]() |
![]() |
![]() |
![]() |
(Порядок, в котором обычно перечисляются штаты, служит только для того, чтобы аббревиатура «MOESI» могла произноситься.)
Этот протокол, более сложная версия более простого протокола MESI , позволяет избежать необходимости записывать «грязную» строку кэша обратно в основную память , когда другой процессор пытается ее прочитать. Вместо этого состояние Owned позволяет процессору передавать измененные данные непосредственно другому процессору. Это полезно, когда связь между двумя процессорами значительно лучше, чем с основной памятью. Примером могут служить многоядерные процессоры с поядерными кэшами L2.
Хотя MOESI может быстро поделиться грязными строками из кеша, ему может быть сложно быстро поделиться чистыми строками из кеша. Если строка кэша чиста по отношению к памяти и находится в совместно используемом состоянии, то не существует очевидного единственного кандидата в кэш, способного ответить на запрос на чтение, поэтому запрос на чтение может быть заполнен из памяти. (Это решается протоколом MESIF , который можно объединить с MOESI для создания MOESIF.)
Если процессор желает выполнить запись в собственную строку кэша, он должен уведомить об этом другие процессоры, которые совместно используют эту строку кэша. Стандартная реализация просто говорит им сделать свои копии недействительными, переводя собственную копию в состояние «Изменено», когда это будет завершено, но в качестве альтернативы она может использовать политику сквозной записи , говоря им обновить свои копии новым содержимым. Это частичная сквозная запись, которая не затрагивает основную память; собственная копия процессора остается в состоянии Owned.
Последнее уменьшает трафик кэша , если имеется несколько активных считывателей, например, сильно конкурирующей блокировки; одна широковещательная запись требует меньше общения, чем отдельные ответы на громоподобный поток запросов на чтение. Поскольку эти два варианта полностью совместимы, они оба могут использоваться в одной и той же системе на основе эвристики , такой как оценка кэшем количества активных читателей этой строки кэша.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Руководство программиста по архитектуре AMD64, том 2, «Системное программирование» » (PDF) . стр. 169–172. Архивировано из оригинала (PDF) 19 июня 2017 года . Проверено 28 августа 2015 г.