-
Notifications
You must be signed in to change notification settings - Fork 12
Барьеры памяти: Обзор железа для разработчиков ПО.
Протоколы когерентности кэшей управляют состояниями кэш-линий для предотвращения рассогласования или потери данных. Данные протоколы могут быть достаточно сложными и обладающими большим количеством состояний, но для наших целей достаточно протокола MESI с четырьмя состояниями.
MESI расшифровывается как Modified, Exclusive, Shared and Invalid (Модифицированная, Исключительная, Общая и Некорректная) – четыре состояния, которые в данном протоколе может принимать кэш-линия. Кэши, использующие данный протокол, должны содержать в каждой кэш-линии двухбитный тэг состояния в дополнение к физическому адресу и данным.
В линию, находящуюся в Modified состоянии, была произведена недавняя запись от соответствующего процессора. Также гарантируется, что данная память не появится в кэше любого другого процессора. Можно сказать что процессор владеет линией, находящейся в данном состоянии. Кэш содержит самые новые данные, следовательно на него ложится ответственность за запись их в память и передачу другим кэшам, причем это должно быть сделано до переиспользования данной линии для хранения каких-либо других данных.
Состояние Exclusive очень похоже на Modified за исключением того, что кэш-линия еще не была изменена процессором, а значит копия данных кэш-линии, расположенная в памяти, находится в актуальном состоянии. Таким образом, кэш может выбросить эту линию не записывая ее обратно в память и не передавая ее другим процессорам.
Линия в состоянии Shared может быть скопирована в кэш как минимум еще одного процессора, а значит данный процессор не имеет права писать данную линию в память, не проконсультировавшись предварительно с остальными. Как и в состоянии Exclusive, так как данные в памяти актуальны, они могут быть выброшены из кэша без записи в память или передачи кому-либо.
Линия, находящаяся в состоянии Invalid пуста, то есть не содержит данных. Когда необходимо положить новые данные в кэш, они могут быть помещены в линию с состоянием Invalid. Данный подход является предпочтительным, так как вытеснение линии с любым другим состоянием может в дальнейшем привести к дорогому промаху в кэш, если вытесненные данные снова понадобятся в будущем.
Поскольку все процессоры должны поддерживать когерентность данных, находящихся в кэш-линиях, протоколы когерентности предоставляют сообщения для координирования движения кэш-линий внутри системы.
Большинство перемещений, описанных в предыдущем разделе, требуют взаимодействия между процессорами. Если процессоры расположены на одной общей шине, то достаточно следующих сообщений:
-
Read: Сообщение содержит физический адрес каш-линии для чтения.
-
Read Response: Данное сообщение содержит данные, запрошенные ранее Read сообщением. Должно быть заполнено памятью или одним из других кэшей. Например, если один из кэшей содержит запрошенные данные в состоянии Modified, то он должен отправить сообщение Read response.
-
Invalidate: Содержит физический адрес кэш-линии, которая должна быть помечена как некорректная. При получении данного сообщения все другие кэши должны удалить соответствующие данные и послать ответ.
-
Invalidate Acknowledge: Процессор, получив Invalidate сообщение, должен ответить данным сообщением после удаления некорректных данных из кэша.
-
Read Invalidate: Содержит физический адрес кэш-линии, одновременно прося другие кэши удалить соответствующие данные. Фактически данное сообщение является комбинацией Read и invalidate сообщений. Требует в качестве ответа Read Response и набора Invalidate Acknowledge сообщений.
-
Writeback: Содержит как адрес, так и данные которые необходимо записать в память (или разослать другим процессорам). Данное сообщение позволяет кэшам выкидывать линии в состоянии Modified, при необходимости освобождения места для новых данных. Интересно отметить, что многопроцессорная система с общей памятью на самом деле представляет из себя машину передачи сообщений. Это означает, что кластеры SMP-машин с распределенной памятью используют обмен сообщениями для организации общей памяти на двух различных архитектурных уровнях.