Протокол MOSI — це розширення базового протоколу MSI когерентності кеша. Він додає стан Owned («власний»), який означає, що поточний процесор є власником цього блоку й обслуговує запити інших процесорів на доступ до нього.

Огляд станів

Для будь-якого рядка кешу можливі такі стани:

Modified (M) (модифікований) — лише один кеш містить дійсну копію блоку, і її значення, найімовірніше, відрізняється від значення в основній пам'яті. Цей стан майже відповідає стану «брудного» блоку (кеш із відкладеним записом), за винятком того, що стан Modified також означає ексклюзивне володіння цим блоком. Стан «брудного» блоку лише означає, що значення блоку відрізняється від значення в основній пам'яті, тоді як Modified означає не тільки це, а й те, що блок кешується лише в одному місці.

Owned (O) (власний) — кілька кешів можуть містити найновіше й правильне значення блоку, тоді як значення в основній пам'яті може бути як актуальним, так і застарілим. У будь-який момент часу лише один кеш може перебувати у стані Owned для певного блоку. Усі інші кеші, що містять той самий блок, повинні перебувати у стані Shared.

Shared (S) (спільний) — блок кешу є дійсним, може одночасно перебувати в кількох кешах і може як збігатися, так і не збігатися зі значенням в основній пам'яті. Інші процесори можуть читати цей блок, але не мають права його змінювати.

Invalid (I) (недійсний) — блок кешу є недійсним.

Для будь-якої заданої пари кешів допустимі стани певного рядка кешу є такими:  M   O   S   I   M   O   S   I 

Операції

У протоколі MOSI кожен кеш підтримує такі запити:

PrRd — запит процесора на читання блоку кешу. PrWr — запит процесора на запис до блоку кешу. BusRd — перехоплений запит (snooped request), який вказує, що інший процесор виконує запит на читання блоку кешу. BusRdX — перехоплений запит, який вказує, що інший процесор виконує запит на запис до блоку кешу, якого він не має. BusUpgr — перехоплений запит, який означає, що інший процесор виконує запис до блоку кешу, який уже міститься в його кеші. Flush — перехоплений запит, після якого блок кешу передається на шину для передавання між кешами.

Транзакції процесора

Якщо блок перебуває у стані Invalid (I), це означає, що він або ніколи не завантажувався з пам'яті, або був позначений як недійсний. Коли надходить запит процесора на читання (PrRd), стан змінюється з Invalid (I) на Shared (S), при цьому формується запит BusRd. Якщо ж надходить запит процесора на запис (PrWr), стан блоку змінюється на Modified (M), а також формується перехоплюваний запит на запис BusRdX.

Якщо блок перебуває у стані Owned (O), запит процесора на читання (PrRd) не породжує жодного сигналу на шині, і блок залишається в тому самому стані. Натомість запит процесора на запис (PrWr) переводить блок зі стану Owned (O) у Modified (M) і супроводжується формуванням запиту BusUpgr.

Коли блок перебуває у стані Modified (M), ні запит на читання (PrRd), ні запит на запис (PrWr) не породжують жодних сигналів на шині, оскільки блок уже містить найновіше й правильне значення лише в цьому кеші. Тому його стан не змінюється і залишається Modified (M).

Якщо блок перебуває у стані Shared (S) і надходить запит процесора на читання (PrRd), то, оскільки значення блоку однакове в усіх кешах і в основній пам'яті, після читання жодних сигналів на шині не формується. Якщо ж надходить запит процесора на запис (PrWr), формується запит BusUpgr, оскільки блок більше не буде дійсним в інших кешах, а його стан змінюється зі Shared (S) на Modified (M).

Транзакції шини

Розглянемо роботу скінченного автомата під час обробки перехоплених транзакцій шини. Якщо блок кешу перебуває у стані Invalid (I), жоден перехоплений запит шини не впливає на нього. Незалежно від того, чи це запит на читання (BusRd), чи запит на запис від процесора, який має або не має цього блоку (BusRdX або BusUpgr), блок залишається у стані Invalid (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.

Якщо блок перебуває у стані Owned (O) і надходить перехоплений запит на читання (BusRd), блок залишається в тому самому стані, одночасно передаючи (Flush) свої дані іншому процесору для читання. Якщо ж надходить перехоплений запит на запис (BusRdX), блок переходить у стан Invalid (I) і також виконує Flush, оскільки інший процесор записує до цього блоку й отримує право власності на нього. Коли інший процесор звертається до такого блоку, він отримує його безпосередньо з кешу, який перебуває у стані Owned (O), а не з основної пам'яті. Якщо надходить BusUpgr, стан просто змінюється з Owned (O) на Invalid (I).

Порівняння з протоколом MSI

Очевидною відмінністю між протоколом MSI та протоколом MOSI, який також називають протоколом Берклі, є наявність у MOSI додаткового стану Owned на додачу до стану Modified (M).

У протоколі MSI, якщо виникає промах під час читання блоку, що перебуває у стані Modified (M), цей блок записується назад до основної пам'яті, а його стан змінюється на Shared (S). У протоколі MOSI завдяки додатковому стану Owned при запиті іншого процесора на читання блок переходить зі стану Modified у Owned, зберігаючи модифікований («брудний») блок у кеші. Це усуває необхідність негайного запису його до основної пам'яті.

Таке відкладання запису може зменшити навантаження на шину й кількість записів до основної пам'яті в певних послідовностях операцій. Наприклад, якщо блок перебуває у стані M у процесора 1, потім процесор 2 читає його, а після цього процесор 1 знову виконує запис, то в MSI перехід M→S спричиняє один запис до пам'яті, а подальший перехід S→M — запит BusUpgr. У MOSI перехід M→O не створює жодного додаткового трафіку, а перехід O→M так само породжує лише BusUpgr. Отже, MOSI усуває початковий запис до пам'яті та відповідний трафік шини, які були б необхідні в MSI.

Порівняння з протоколом MESI

І MESI (також відомий як протокол Іллінойсу), і MOSI є розширеннями протоколу MSI, але вони покращують різні аспекти його роботи. MOSI зосереджується на зменшенні кількості записів назад до пам'яті, тоді як MESI прагне зменшити кількість транзакцій на шині, необхідних після операцій читання та запису інших процесорів. Стан Exclusive (E) у MESI означає, що блок кешу є дійсним, «чистим» (має те саме значення, що й в основній пам'яті) і міститься лише в одному кеші. Натомість стан Owned (O)''' у MOSI означає, що блок кешу є дійсним, потенційно модифікованим («брудним»), доступним для запису й може одночасно перебувати в кількох кешах (при цьому всі кеші містять однакове значення).

Див. також Протокол MSI Протокол MESI Write-once (режим кеша) Протокол MOESI Протокол MESIF Протокол MERSI Протокол Dragon Протокол Firefly (режим кеша)

Примітки