У обчислювальній техніці протокол MSI — це базовий протокол когерентності кешу, який використовується в багатопроцесорних системах. Як і в інших протоколах когерентності кешу, літери в назві протоколу позначають можливі стани, у яких може перебувати рядок кешу.

Огляд

У протоколі MSI кожен блок, що міститься в кеші, може перебувати в одному з трьох можливих станів:

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

Ці стани когерентності підтримуються завдяки взаємодії між кешами та основним сховищем. Кеші мають різні обов'язки під час читання або запису блоків, а також коли вони отримують інформацію про те, що інші кеші виконують операції читання або запису для певного блоку.

Коли до кешу надходить запит на читання блоку, що перебуває у стані M або S, кеш надає запитувані дані. Якщо блок відсутній у кеші (стан I), необхідно перевірити, що він не перебуває у стані M в іншому кеші. Різні архітектури кешування реалізують це по-різному. Наприклад, архітектури із загальною шиною часто використовують прослуховування шини (bus snooping), коли запит на читання транслюється до всіх кешів. Інші архітектури використовують каталоги кешу, що містять агенти (каталоги), які знають, у яких кешах востаннє зберігалися копії певного блоку. Якщо інший кеш містить цей блок у стані M, він повинен записати дані до основного сховища та перейти у стан S або I. Після запису будь-якого рядка зі станом M кеш отримує блок або з основного сховища, або з іншого кешу, який містить його у стані S. Після цього кеш може надати дані запитувачу. Після передавання даних блок кешу переходить у стан S.

Коли до кешу надходить запит на запис для блоку, що перебуває у стані M, кеш змінює дані локально. Якщо блок перебуває у стані S, кеш повинен повідомити всі інші кеші, які можуть містити цей блок у стані S, що вони мають витіснити його. Таке повідомлення може здійснюватися за допомогою прослуховування шини або каталогу, як описано вище. Після цього дані можна локально змінити. Якщо блок перебуває у стані I, кеш повинен повідомити всі інші кеші, які можуть містити цей блок у стані S або M, що вони мають витіснити його. Якщо блок перебуває в іншому кеші у стані M, той кеш повинен або записати дані до основного сховища, або передати їх кешу, який надіслав запит. Якщо на цей момент блок ще відсутній у локальному кеші, він зчитується з основного сховища перед модифікацією в кеші. Після зміни даних блок кешу переходить у стан M.

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

Машина станів

Запити процесора до кешу включають:

PrRd — запит процесора на читання блоку кешу. PrWr — запит процесора на запис до блоку кешу.

Крім того, існують запити з боку шини:

BusRd — коли в кеші процесора виникає промах під час читання, він надсилає по шині запит BusRd і очікує отримати у відповідь блок кешу. BusRdX — коли в кеші процесора виникає промах під час запису, він надсилає по шині запит BusRdX, у відповідь на який отримує блок кешу, а відповідний блок у кешах інших процесорів позначається як недійсний. BusUpgr — коли в кеші процесора відбувається влучання під час запису, він надсилає по шині запит BusUpgr, щоб позначити відповідний блок у кешах інших процесорів як недійсний. Flush — запит, який означає, що весь блок кешу записується назад до пам'яті.

Переходи між станами:

Invalid (недійсний): Після PrRd надсилається BusRd, а стан змінюється на Shared. Після PrWr надсилається BusRdX, а стан змінюється на Modified. Після BusRd, BusRdX або BusUpgr недійсний блок залишається у стані Invalid.

Shared (спільний): Після PrRd блок залишається у стані Shared. Після PrWr надсилається BusUpgr, а стан змінюється на Modified. Після BusRd блок залишається у стані Shared. Після BusRdX або BusUpgr блок переходить у стан Invalid.

Modified (модифікований): Після PrRd або PrWr блок залишається у стані Modified. Після BusRd блок кешу записується на шину (Flush), а стан змінюється на Shared. Після BusRdX блок кешу записується на шину (Flush), а стан змінюється на Invalid. BusUpgr у цьому стані неможливий. Зверніть увагу, що якщо блок кешу перебуває у стані Modified в одному процесорі, то в усіх інших процесорах він обов'язково має перебувати у стані Invalid, оскільки стан Modified може належати або жодному, або лише одному процесору. Це фактично унеможливлює появу BusUpgr на шині, адже для нього потрібно, щоб блок перебував у стані Shared в одному з процесорів, який, як було показано вище, виконує PrWr.

Використання

Цей протокол подібний до протоколу, який використовувався в комп'ютері SGI 4D.

Варіанти

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

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

Примітки