Протокол MESI
Протокол MESI. Среди известных протоколов наблюдения безусловно наиболее популярным является протокол MESI (Modified/Exclusive/Shared/Invalid). Протокол MESI широко используется в коммерческих микропроцессорных системах, например, на базе микропроцессоров Pentium и PowerPC. Так, его можно обнаружить во внутреннем кэше и контроллере внешнего кэша i82490 микропроцессора Pentium, в процессоре i860 и контроллере кэш-памяти MC88200 фирмы Motorola. Протокол был разработан для кэш-памяти с обратной записью. Одной из основных задач протокола MESI является откладывание на максимально возможный срок операции обратной записи кэшированных данных в основную память системы. Это позволяет улучшить производительность системы за счет минимизации ненужных пересылок информации между кэшами и основной памятью. Протокол MESI приписывает каждой кэш-строке одно из четырех состояний, которые контролируются двумя битами состояния MESI в теге данной строки. Состояние кэш-строки может быть изменено как процессором, для которого эта кэш-память является локальной, так и другими процессорами мультипроцессорной системы. Управление состоянием кэш-строк может быть возложено и на внешние логические устройства. Одна из версий протокола предусматривает использование ранее рассмотренной схемы однократной записи. Каждая строка согласно протоколу MESI может быть в одном из четырех возможных состояний (в дальнейшем будем ссылаться на эти состояния с помощью букв M, E, S иI): Рис. 11.14. Протокол MESI — диаграмма состояний без учета однократной записи Модифицированная (M, Modified) — данные в кэш-строке, помеченной как M, были модифицированы (подверглись изменению), но измененная информация не была переписана в основную память. Это означает, что информация, содержащаяся в рассматриваемой строке, достоверна только в данном кэше, а в основной памяти и остальных кэшах — недостоверна; Эксклюзивная(E, Exclusive) — данная строка в кэше не подвергалась изменению посредством запроса на запись, совпадает с аналогичной строкой в основной памяти, но отсутствует в любом другом локальном кэше. Иными словами, данная строка достоверна в этом кэше и недостоверна в любом другом кэше; Разделяемая(S, Shared) — данная строка в кэше совпадает с аналогичной строкой в основной памяти (данные достоверны) и может присутствовать в одном или нескольких из прочих кэшей; Недействительная(I, Invalid) — кэш-строка, помеченная как недействительная, не содержит достоверных данных и становится логически недоступной. Порядок перехода строки кэш-памяти из одного состояния в другое зависит от: текущего состояния строки, выполняемой операции (чтение или запись), результата обращения к строке (попадание или промах) и, наконец, от того является ли строка совместно используемой или нет. На рис. 11.14 приведена диаграмма основных переходов без учета режима однократной записи. Предположим, что один из процессоров делает запрос на чтение из строки, в данный момент отсутствующей в его локальной кэш-памяти (промах при чтении). Запрос будет широковещательно передан по шине. Если ни в одном другом кэше нет копии нужной строки, то ответной реакции от контроллеров слежения других процессоров не последует, строка будет считана в кэш запросившего процессора из основной памяти, а копии будет присвоено состояниеE. Если в каком-либо из локальных кэшей имеется копия требуемой строки, от соответствующего контроллера слежения поступит отклик, означающий доступ к совместно используемой строке. Все копии рассматриваемой строки во всех кэшах будут переведены в состояние S, вне зависимости от того, в каком состоянии они были до этого (M, E или S). Рис. 11.15. Последовательность смены состояний в протоколе MESI Если процессор делает запрос на запись в строку, отсутствующую в его локальной кэш-памяти (промах при записи), перед загрузкой в кэш-память строка должна быть считана из основной памяти и модифицирована. Прежде чем процессор сможет загрузить строку, он должен удостовериться, что в основной памяти действительно находится достоверная версия данных, то есть что в других кэшах отсутствует модифицированная копия данной строки. Формируемая в данном случае последовательность операций носит название чтение с намерением модификации (RWITM, Read With Intent To Modify). Если в одном из кэшей имеется копия нужной строки, находящаяся в состоянииM, то процессор, обладающий этой копией, прерывает RWITM-последовательность и переписывает строку в основную память, после чего меняет состояние строки в своем кэше на I. Затем RWITM-последовательность возобновляется и делается повторное обращение к основной памяти для считывания обновленной строки. Окончательным состоянием строки будет M, при котором ни в основной памяти, ни в других кэшах нет еще одной достоверной ее копии. Если копия строки существовала в другом кэше и не имела состояния M, то такая копия аннулируется и доступ к основной памяти производится немедленно. Рис. 11.16. Переход из состояния E в состояние S в протоколе MESI Кэш-попадания при чтении не изменяет состояния читаемой строки. Если процессор производит доступ для записи в существующую строку, находящуюся в состоянии S, он передает на шину широковещательный запрос с тем чтобы информировать другие кэши, обновляет строку в своем кэше и меняет ее состояние на M. Все остальные копии строки переводятся в состояние I. Если процессор производит доступ по записи в строку, находящуюся в состоянии E, единственное, что он должен сделать — это произвести запись в строку и изменить ее состояние на M, поскольку другие копии строки в системе отсутствуют. На рис. 11.15 показана типичная последовательность событий в системе из двух процессоров 1 и 2, запрашивавших доступ к ячейке x. Обращение к любой ячейке строки кэш-памяти рассматривается как доступ ко всей строке. Проиллюстрируем этапы, когда процессор 2 пытается прочитать содержимое ячейки x” (рис. 11.16). Возникает кэш-промах по чтению и процессор пытается обратиться к основной памяти. Процессор 1 следит за шиной, обнаруживает обращение к ячейке, копия которой есть в его кэш-памяти и находится в состоянии M, поэтому он блокирует операцию чтения от процессора 2. Затем процессор 1 переписывает строку, содержащую x”, в основную память и освобождает процессор 2, чтобы тот мог повторить доступ к основной памяти. Теперь процессор 2 получает строку, содержащую x”, и загружает ее в свою кэш-память. Обе копии переводятся в состояние S. До сих пор рассматривалась версия протокола MESI без однократной записи. С учетом однократной записи диаграмма состояний, изображенная на рис. 11.14 немного видоизменяется. Все кэш-промахи при чтении вызывают переход в состояние S. Первое попадание при записи вызывает переход в состояние E(так называемый переход однократной записи). Следующее попадание при записи вызывает переход в состояние M.
|