Введение

Протокол обеспечения когерентности кэша включает состояние Owned как расширение протокола MSI. Протокол MOSI является расширением базового протокола когерентности кэша MSI. Он добавляет состояние Owned, которое указывает, что данный процессор владеет этим блоком и будет обрабатывать запросы на этот блок от других процессоров.

Операции с обработчиком

Рассматривая случай транзакций процессора, когда блок находится в состоянии Invalid (I), блок кэша либо никогда не был запрошен из памяти, либо был аннулирован. При чтении процессором (PrRd) состояние изменяется с недействительного (I) на общее (S), что приводит к генерации запроса чтения шины (BusRd). Одновременно, если поступает запрос записи процессора (PrWr), состояние блока изменяется на модифицированное (M) вместе с запросом записи с отслеживанием (BusRdX). Как только блок переходит в состояние Owned (O), чтение процессором (PrRd) не генерирует никаких сигналов отслеживания, и блок остается в том же состоянии. В то время как запрос записи от процессора (PrWr) приводит к изменению состояния блока с owned (O) на модифицированное (M) и генерации запроса обновления шины (BusUpgr). Когда блок находится в состоянии Modified (M), ни запрос чтения процессором (PrRd), ни запрос записи процессором (PrWr) не генерируют сигналы отслеживания, поскольку блок уже указывает, что самое последнее и корректное значение содержится только в этом кэше. Следовательно, состояние не изменяется, и блок остается в состоянии modified (M). В то время как блок находится в состоянии Shared (S) и поступает запрос чтения процессором (PrRd), поскольку значение блока кэша одинаково во всех остальных процессорах и в основной памяти, после чтения процессором (PrRd) не генерируется никаких сигналов шины. Запрос записи шины (BusUpgr) генерируется при поступлении запроса записи процессора (PrWr) к блоку в состоянии shared (S), поскольку блок кэша больше не является действительным во всех остальных кэшах, и состояние блока изменяется с shared (S) на модифицированное (M).

Транзакции на автобусе

Учитывая поведение конечного автомата при обработке транзакций снюппинга шины, если блок кэша находится в состоянии Invalid (I), то никакой запрос снюппинга шины не повлияет на блок каким-либо образом. Следовательно, даже если это запрос на чтение (BusRd) или запись (BusRdX или BusUpgr) от процессора, который имеет или не имеет этот блок, блок останется в том же недействительном (I) состоянии и не вызовет никаких дальнейших действий. Когда блок кэша находится в состоянии Shared (S) и происходит транзакция считывания шины (BusRd), блок остается в том же состоянии и не генерирует дополнительных транзакций, поскольку все блоки кэша имеют одинаковое значение, включая основную память, и выполняется только чтение, а не запись. Если поступает запрос на запись (BusRdX или BusUpgr), состояние блока изменяется с shared (S) на invalid (I), так как значение блока было изменено в одном из других блоков кэша, и все остальные копии должны быть аннулированы. Как только блок кэша переходит в состояние Modified (M) и поступает запрос на чтение шины (BusRd), блок сбрасывает (Flush) измененные данные и переходит в состояние owned (O), становясь таким образом единственным владельцем этого конкретного блока кэша. В то же время, находясь в состоянии modified (M), запрос на запись шины (BusUpgr) от другого процессора невозможен, поскольку у него нет этого блока кэша. При запросе на запись от другого процессора, у которого нет блока (BusRdX), блок изменяет свое состояние на invalid (I), так как другой процессор записывает в блок и, следовательно, получает право собственности на него. Пока блок кэша находится в состоянии modified, запрос BusUpgr от любого другого процессора невозможен, так как ни у кого из них нет этого блока. По определению состояния modified (M), только этот процессор имеет блок, все остальные недействительны и, следовательно, не могут инициировать запрос BusUpgr. Находясь в состоянии Owner (O) и получая запрос на чтение (BusRd), блок остается в том же состоянии, одновременно сбрасывая (Flush) данные для чтения другим процессором. При запросе на запись (BusRdX) блок переходит в состояние invalid (I) вместе со сбросом (Flush) данных, так как другой процессор записывает в него, теряя таким образом право собственности на этот блок. Всякий раз, когда другой процессор пытается получить доступ к этому блоку, вместо обращения к памяти он берет его из другого кэша, который уже имеет этот блок в состоянии owned (O). Запрос BusUpgr просто изменяет состояние с owner (O) на invalid (I). Суть добавления дополнительного состояния (owned) в протокол MOSI заключается в том, что он дополняет состояние modified (M). В протоколе MSI, при запросе на прочтение блока, находящегося в состоянии modified (M), данные записываются обратно в основную память, а статус блока изменяется на shared (S). Однако в протоколе MOSI, с дополнительным состоянием (owned), при запросе на чтение от другого процессора блок переходит из состояния modified в состояние owned (O) и сохраняет "грязный" блок кэша, устраняя необходимость немедленной записи в основную память. Такая отсрочка может снизить нагрузку на шину и уменьшить количество операций записи в основную память в определенных последовательностях транзакций. Например, если кэш процессора 1 находится в состоянии M, процессор 2 читает из него, а затем процессор 1 снова записывает в него. В MSI переход MS процессора 1 после чтения приводит к одной записи в память, а затем переход SM вызывает BusUpgr. В MOSI переход MO не генерирует трафик, а переход OM также генерирует один BusUpgr, как и раньше. Таким образом, MOSI избавляет от первоначальной записи в память и связанного с ней трафика шины, которые выполнялись бы в MSI.

Сравнение с протоколом MESI

Протоколы MESI (также известные как Illinois) и MOSI являются расширениями протокола MSI, предназначенными для улучшения различных функций. MOSI ориентирован на уменьшение количества обратных записей в память, а MESI – на сокращение числа транзакций шины, необходимых после запроса на чтение или запись от другого процессора. Эксклюзивное (E) состояние в протоколе MESI означает, что блок кэша действителен, чист (имеет такое же значение, как в основной памяти) и хранится только в одном кэше, в то время как состояние "принадлежность" (O) в протоколе MOSI означает, что блок кэша действителен, потенциально изменен, доступен для записи и может присутствовать более чем в одном кэше (при этом во всех кэшах содержится одно и то же значение).