У літературі, присвяченій протоколам когерентності кеша, Write-Once був першим визначеним протоколом, що став основою для протоколу MESI. Його оптимізація полягає у використанні запису наскрізь (write-through) під час першого запису та відкладеного запису (write-back) для всіх наступних записів, що зменшує загальний трафік шини під час послідовних записів до комп'ютерної пам'яті. Уперше цей протокол був описаний Джеймсом Р. Гудманом у 1983 році. Протоколи когерентності кешу є важливою складовою симетричних багатопроцесорних систем, у яких кожен процесор підтримує власний кеш процесора.

Стани

У цьому протоколі кожен блок локального кешу перебуває в одному з чотирьох станів:

Недійсний (Invalid): цей блок містить некогерентну копію даних із пам'яті. Дійсний (Valid): цей блок містить когерентну копію даних із пам'яті. Дані можуть бути спільними для кількох кешів, але їхній вміст не змінювався. Зарезервований (Reserved): цей блок є єдиною копією даних із пам'яті, але вона залишається когерентною. Якщо блок буде витіснений із кешу, запис назад до пам'яті не потрібний. Брудний (Dirty): цей блок є єдиною копією даних із пам'яті та є некогерентним. Ця копія була змінена один або більше разів. Це єдиний стан, у якому під час витіснення блоку з кешу виконується запис назад (write-back) до пам'яті.

Ці стани мають точно такі самі значення, як і чотири стани протоколу MESI (лише перелічені у зворотному порядку), але протокол є його спрощеним варіантом, який не використовує операцію Read for Ownership. Натомість усі операції інвалідації виконуються через запис до основної пам'яті.

Для будь-якої заданої пари кешів допустимі стани певного рядка кешу є такими (скорочення наведено у порядку, зазначеному вище):  I   V   R   D   I   V   R   D 

Переходи

Протокол визначає правила переходу між станами для кожної події:

Влучання читання (Read hit): дані надаються поточним кешем. Стан не змінюється. Промах читання (Read miss): дані зчитуються з основної пам'яті. Операція читання відстежується іншими кешами; якщо будь-який із них містить цей рядок у стані Брудний (Dirty), читання призупиняється на час, необхідний для запису даних назад до пам'яті, після чого продовжується. Усі копії, що перебували у станах Брудний або Зарезервований, переводяться у стан Дійсний. Влучання запису (Write hit): якщо рядок кешу перебуває у стані Брудний або Зарезервований, він оновлюється безпосередньо в кеші, а його стан встановлюється як Брудний без оновлення основної пам'яті. Якщо ж рядок перебуває у стані Дійсний, виконується операція write-through, яка оновлює і блок, і основну пам'ять, після чого стан блоку змінюється на Зарезервований. Інші кеші, що відстежують цю операцію запису, переводять свої копії у стан Недійсний. Промах запису (Write miss): частковий запис у рядок кешу обробляється як промах читання (якщо необхідно отримати незаписану частину рядка кешу), після чого виконується влучання запису. У результаті всі інші кеші переходять у стан Недійсний, а поточний кеш — у стан Зарезервований.

Це один із варіантів протоколу MESI, але без явної операції Read for Ownership або широкомовної інвалідації (broadcast invalidate), які переводять рядок кешу до стану Exclusive без запису до основної пам'яті. Натомість перший запис у рядок кешу, що перебуває у стані Дійсний (тобто Shared), виконується через write-through до пам'яті, що неявно інвалідує копії цього рядка в інших кешах. Після цього рядок переходить у стан Зарезервований (Exclusive), і всі наступні записи можуть виконуватися без звернення до основної пам'яті, залишаючи рядок кешу у стані Брудний (Modified).

Примітки