
- •Обеспечение согласованности кэш-памяти микропроцессоров в мультипроцессорных системах
- •Программные механизмы обеспечения когерентности.
- •Аппаратные способы обеспечения когерентности.
- •Протоколы наблюдения.
- •Протокол mesi
- •Другие протоколы наблюдения сходные с mesi: msi, mosi, moesi, mesif.
- •Протоколы на основе справочника.
- •Литература.
Другие протоколы наблюдения сходные с mesi: msi, mosi, moesi, mesif.
Хотя MESI наиболее распространенный протокол, но используются и другие сходные протоколы.
Рис.7. Диаграмма MSI. |
Таким образом, любая не модифицированная строка находится в состоянии S, а значит, процессор никогда не может считать, что обладает эксклюзивной строкой и потому, его попытка записи в эту строку всегда должна сопровождаться широковещательным оповещением других процессорных кэшей.
Следовательно, протокол MSI хотя и проще в работе, чем MESI, но больше нагружает шину, поэтому он встречается редко.
Если протоколы MESI и MSI применяются как в многопроцессорных системах, так и в системах с одним процессором, имеющим несколько кэшей, то протоколы MOSI, MOESI, MESIF предполагают, что обмен данными между кэшами выполняется быстрее, чем между кэшем и основной памятью. Такая архитектура характерна для однопроцессорных систем, где доступ к основной памяти выполняется через общую шину, а кэши связаны более быстрыми внутренними шинами.
Протокол MESIF, по сравнению с MESI, имеет дополнительное состояние F (Forwarded), которое является подтипом состояния S. Но среди всех копий строки в разных кэшах, только одна из них может иметь состояние F. Когда поступает запрос на чтение этой строки, то строка читается не из основной памяти, а только из того кэша, где она отмечена в состоянии F. Если оказывается, что нет копии в состоянии F, то будет включен механизм арбитража, который будет определять, из какого кэша следует считывать копию.
Для того чтобы гарантировать присутствие не более одной копии в состоянии F и чтобы увеличить вероятность присутствия хоть одной копии в состоянии F – этим состоянием помечается последняя по времени записанная копия, а та копия, с которой она писалась, переходит в состояние S. Т.о. алгоритм назначения напоминает эстафетную палочку – в F всегда оказывается та копия, которая была создана последней. Например, начинаем мы, с того, что в каком-то кэше лежит строка в Exclusive. При запросе копии другим кэшем – кэш-владелец E-строки отвечает на запрос вместо основной памяти, и одновременно меняет состояние своей строки на Shared. А вот новая копия, созданная по его ответу, будет как раз в состоянии F, на следующий запрос копии будет отвечать уже ее владелец. Ответив, он сбросит состояние своей строки на обычное S, а только что созданная копия в другом кэше станет новым F – и так далее...
Логика здесь такая: во-первых, статистически, последняя загруженная копия, скорее всего, будет и последней выгруженной. То есть такая передача ответственности позволяет как можно дольше избегать пропадания выделенной копии (пропадания за счет вытеснения). А во-вторых, передача ответственности позволяет балансировать нагрузку – дополнительные обязанности по ответу на запросы копии не висят постоянно на одном и том же кэше, а передаются от кэша к кэшу эстафетой.
Дополнительные бонусы возникают в случае NUMA архитектуры. В этом случае ответственная F-копия будет чаще оказываться в «территориально» более близком блоке кэша – более близком к тому, который следующим захочет получить копию.
Рис.8. Диаграмма MOSI. |
Для этого, во-первых, функции M-состояния расширяются – кэш, который содержит строку в таком состоянии, должен отвечать на запросы получения копии этой строки. А во-вторых, вводится новое состояние O (Owned – личный, находящийся в собственности), которое означает «копия не синхронизирована с памятью, и существуют другие копии».
Отвечая на запрос чтения M-строки кэш, меняет состояние своей строки с M на O, а получивший копию кэш ставит ее в S.
Пока Owned строка существует, она продолжает отвечать на все запросы копии. Если процессор, владеющий этой строкой, снова решит ее модифицировать – состояние меняется снова на M, и широко рассылается запрос на аннулирование для всех Shared-копий.
Разумеется, любой запрос на вытеснение Owned-строки будет задержан на время сброса ее данных в основную память.
Таким образом, состояние O является подтипом состояния M и явно указывает на то, что кэши нескольких процессоров имеют достоверные копии строки, но основная память содержит недостоверную копию.