Как работает кэш память
Конспект видео: https://www.youtube.com/watch?v=7n_8cOBpQrg
Суть кэширования
• Кэш расположен на самом процессоре
• Сокращение задержек доступа
Схема работы
• Состоит из контроллера, который управляет кэшем и самой кэш памяти
• 1. Кэш берет пакет данных из ОП по машинному слову (или больше?)
• 2. Когда процессору нужны данные, он обращается к контроллеру, который смотрит, есть ли копия данных в кэше.
• 3. Если есть то данные из кэша идут в процессор или запрос отправляется ОП и потом в процессор
• 4. После изменения данных процессором, они отправляются в кэш, после чего из кэша переписываются обратно в ОП
• Режим Write back: процессор => кэш => ОП
• Минусы: если будет сбой питания и данные не успеют выгрузиться из кэша, то они будут потеряны
• Режим Write through: процессор => кэш и ОП
Кэш строка
• Кэш хранит данные не по байтам, а ячейками по несколько байтов. Такая ячейка называется кэш строкой. В 86х процессорах её размер = 64 байта.
• Для каждой ячейки хранится адрес только первого байта ячейки
Размер кэша
• В кэш строке не только данные, но и служебные. Поэтому есть полезный размер кэша.
Кэш прямого отображения
• Кэш прямого отображения - каждая строка ОП соответствует индексу кэш строке
• Минусы: могут случиться коллизии из-за претендования строк ОП на одну и ту же кэш строку.
Наборно ассоциативный кэш
• Кэш состоит из каналов, где каждый канал это кэш прямого отображения.
• Полностью ассоциативный кэш - каждая строка ОП может попасть в любую кэш строку => медленно при поиске
Алгоритмы замещения
• Для скорости работы с памятью, кэш должен предугадать какие данные нужно загрузить из ОП, какие могут понадобиться процессору. Для этого есть алгоритмы замещения
• LRU (last recently used) - замещаются те, к которым дольше всего небыло обращений - ожидается, что данные будут использованы повторно в ближайшее время
• MFU (most frequently used) - замещаются последние используемые данные - ожидается, что данные не будут повторно использованы в ближайшее время
• LFU (last frequently used) - замещаются данные используемые реже всех
Многоуровневый кэш
• Инструкции и данные храняться отдельно
• Чем больше размер кэша - тем дольше поиск - тем медленнее
• Поэтому лучше несколько маленьких кэшей, чем 1 большой.
• В процессорах intel кэш делиться на 3 уровня:
• L1 - 32 kb - 32 kb - данные 8-канальный - Инструкции 4к
• L2 - 512 kb - 8к
• L3 - 2 mb - 16к
Взаимодействие уровней
• Инклюзивное - данные дублируются в уровни: из ОП в L2, данные из L1 перезаписываются на L2
• Эксклюзивное - данные взаимоисключающие: из ОП в L2, данные из L1 отправляются в L2, а из L2 на это место записываются новые (обмен).
Типы данных и кэш
• Время на отбрасывание бит не зависит от их количества.
• Процессор 64х всегда берет 64 бита из кэша для работы
• Поэтому данные на 64 бита быстрее, ведь не нужно отбрасывать биты.
• Но если всегда использовать данные на 64 бита, то кэш быстрее забьется
• Если нужные данные не вмещаются в кэш, то придётся лезть в ОП и это дольше чем отбрасывать биты
• Расширение численного типа - числа 8 и 16 бит (byte, short) приводятся к 32 бит (int). В арифметических операциях, битовый сдвиг, сравнение.
• Расширение происходит, потому что:
• Регистры процессора — 32-битные или 64-битные.
• Операции с int выполняются быстрее или проще реализуются.
• Избежание неожиданных переполнений
• Если все арифметические операции по умолчанию используют int, компилятору проще реализовать правила вычислений (не надо писать отдельную логику для byte, short, char), и избегать дублирования кода.
Когерентность кэша
• Это согласованность содержимого кэш памяти и ОП.
• Несколько кэшей могут работать с 1 участком памяти, так как иногда одни и те же данные нужны в многоядерном процессоре и чтобы небыло конфликтов нужна когерентность.
• Для этого введены состояния, где только в одном кэше может изменяться 1 кэш строка
• Состояния:
• S - Shared - актуальная строка соответсвующая строке из ОП
• I - Invalid - строка с неактуальными данными, работать с ней нельзя, нужно послать запрос на новую строку из ОП
• M - modified - когда строка меняется, то кэш сигналит другим кэшам, что строка изменена и их строки получают состояния I. После этого строка идёт в ОП, где другие кэши берут её
• Чтобы не тратить время на оповещение остальных кэшей об изменении, то сначала смотрится, есть ли эта строка в других кэшах. Если нет, то её состояние = E - Exclusive.
• Когда строка изменена, и другой кэш запрашивает её, то он меняет состояние на O - owned, и передаёт строку напрямую другому кэшу