(Подробное описание см. В разделе Протоколы согласованности кэша (примеры) )
В вычислениях MOESI - это протокол полной когерентности кеша, который охватывает все возможные состояния, обычно используемые в других протоколах. В дополнение к четырем общим состояниям протокола MESI существует пятое состояние «Собственные», представляющее данные, которые являются как измененными, так и совместно используемыми. Это позволяет избежать необходимости записывать измененные данные обратно в основную память перед их совместным использованием. Хотя в конечном итоге данные должны быть записаны обратно, обратная запись может быть отложена.
Для того, чтобы это было возможно, должна быть возможна прямая передача данных из кэша в кэш, чтобы кэш с данными в измененном состоянии мог передавать эти данные другому считывателю без передачи их в память.
Как описано в Руководстве программиста по архитектуре AMD64 Vol. 2 ' Системное программирование ', каждая строка кэша находится в одном из пяти состояний:
Для любой данной пары кешей разрешенные состояния данной строки кэша следующие:
M | О | E | S | я | |
---|---|---|---|---|---|
M | N | N | N | N | Y |
О | N | N | N | Y | Y |
E | N | N | N | N | Y |
S | N | Y | N | Y | Y |
я | Y | Y | Y | Y | Y |
(Порядок, в котором обычно перечислены состояния, служит только для того, чтобы аббревиатура «MOESI» стала произносимой.)
Этот протокол, более сложная версия более простого протокола MESI (но не в расширенном MESI - см. Когерентность кэша ), позволяет избежать необходимости записывать грязную строку кэша обратно в основную память, когда другой процессор пытается ее прочитать. Вместо этого состояние Owned позволяет процессору передавать измененные данные непосредственно другому процессору. Это полезно, когда задержка связи и пропускная способность между двумя процессорами значительно лучше, чем с основной памятью. Примером могут служить многоядерные процессоры с кэшем второго уровня на ядро.
Хотя MOESI может быстро обмениваться грязными строками из кеша, он не может быстро передавать чистые строки из кеша. Если строка кэша чиста по отношению к памяти и находится в общем состоянии, то любой запрос отслеживания к этой строке кеша будет заполняться из памяти, а не из кеша.
Если процессор желает записать в строку собственного кэша, он должен уведомить другие процессоры, которые совместно используют эту строку кэша. В зависимости от реализации он может просто сказать им сделать свои копии недействительными (переместить свою копию в состояние Modified) или может сказать им обновить свои копии новым содержимым (оставив свою копию в состоянии Owned).