предисловие
Праздник 1 мая закончился, и после просмотра дорамы в течение четырех дней, я снова начну пенсионную жизнь 975. Я напишу статью о тайнике в первый день праздника.Пожалуйста, поправьте меня, если я ошибаюсь.
текст
Зачем нужен кеш
Все мы знаем, что программа состоит из инструкций и данных, и работа ЦП во время выполнения также заключается в многократном выполнении инструкций с различным использованием.
В начале программа загружается в основную память.Во время выполнения программы инструкции извлекаются из основной памяти и выполняются одна за другой.Макроскопически мы рассматриваем основную память как большой одномерныйбайтМассив, адрес можно рассматривать как нижний индекс массива. Такая структура может гарантировать бесперебойное выполнение программы. Однако есть проблема.Скорость чтения основной памяти слишком низкая, а скорость работы ЦП очень высока.После того, как ЦП выполняет инструкцию, он очень долго ждет, прежде чем поступит следующая инструкция, и ресурсы ЦП серьезно потрачены впустую.
Фактически, скорость, с которой ЦП выполняет инструкции, вначале не особенно высока, и ее скорость повышается за счет непрерывной оптимизации. Через некоторое время скорость, с которой ЦП выполняет инструкции, становится все быстрее и быстрее.В это время обнаружено, что узким местом, влияющим на скорость выполнения программы, является не ЦП, а разрыв в скорости между выполнением ЦП. инструкции и инструкции по чтению основной памяти, так что надо подумать.Способ сделать чтение инструкций быстрее, это наш кеш.
Знакомство с кешем
Диаграмма иерархии памяти после введения кэша показана ниже Конечно, это всего лишь упрощенная диаграмма, которая поможет нам понять уровень структуры всей памяти. Где L1, L2 — это то, что мы называем кешем, Эта структура похожа на пирамиду: чем она выше, тем ближе к центральному процессору, тем выше скорость чтения и записи и тем дороже ее построение.
фигура 1 Здесь нам также необходимо предложить концепцию блока кеша.L0 хранит кеш L1, L1 хранит кеш L2 и т. д. Данные всегда перемещаются вверх и вниз между уровнями, поэтому единицу перемещения данных мы называем кеш-блок. Например, если предполагается, что размер кэш-блока L0 и L1 составляет 8 КБ, то единица передачи будет равна 8 КБ. Физическая структура кэша L1 показана на следующем рисунке.фигура 2Здесь мы предполагаем, что размер блока кеша между L1 и L2 составляет 8 КБ, а размер блока кеша между L2 и основной памятью составляет 64 КБ в качестве примера, чтобы проиллюстрировать весь процесс инструкций чтения CPU.Адресатор сначала перейдет к Кэш L1.Ищите инструкцию.Если ЦП нет,ждите пока адресант будет искать инструкцию в КЭШе L2.Если КЭШ L2 не найдет,то ищите инструкцию из основной памяти. Найдя инструкцию, переместите все данные блока кэша попаданий (64 КБ) в L2, а все данные блока кеша (8 КБ), соответствующего L2, переместите в L1. Наконец, соответствующая отдельная инструкция возвращается в ЦП в L1.
Почему мы придумали концепцию кэш-блоков?
Инструкции нашей программы часто непрерывны. Когда программа обращается к определенным данным, она и окружающие ее данные, вероятно, будут снова доступны через короткий промежуток времени. Это называется принципом локальности. Поэтому, когда мы обращаемся к фрагменту данных, мы просто упоминаем его и окружающие его данные в кеше верхнего уровня, и в следующий раз мы можем получить данные прямо из кеша.
Как оценить попадание в кеш
В предыдущем разделе кратко описывался поток данных в структуре памяти, когда ЦП извлекает инструкции.Мы говорим, что если в L1 нет данных, к которым мы обращаемся, они отправятся в L2, чтобы найти их.Мы называем это промахом кеша, так как чтобы судить, попадал ли он в кеш? Увеличим кэш на рис. 2 и посмотрим на его структуру.
изображение 3 Наш блок кэша имеет дополнительный 1 значащий бит и t битов битового флага в дополнение к реальному блоку данных блока кэша, и мы предполагаем, что кэш L1 имеет S таких блоков кэша. (Обратите внимание, что размер блока кеша, о котором мы говорили ранее, относится к реальному размеру блока данных блока кеша, поэтому здесь у нас есть размер емкости кеша L1 = S * B байтов)Если вы задаетесь вопросом о значении t, b и s, не беспокойтесь об этом сейчас, и вы, естественно, узнаете, если продолжите смотреть вниз.
Если ЦП теперь хочет получить доступ к данным, адрес которых является адресом, адресатор делит адрес следующим образом:
Рисунок 4 Адресатор разрешает адрес в соответствии со следующими шагами:-
Найдите группы на основе битов группового индекса
-
Проверьте, равен ли допустимый бит блока кеша 1. Если да, сравните биты флага.Если биты флага непротиворечивы, это означает, что кеш попал. Блок кэша успешно обнаружен
-
Вычислить адрес смещения на основе последних b бит
Здесь t, b и s соответствуют данным на фиг.3. Предположим, что мы 64-битная машина, тогда длина адреса должна быть равна 64, то есть t+s+b=64.
Два типа промахов кеша
Есть два случая промаха кеша, один - кеш пуст, другой - конфликт кеша. Первая ситуация чаще встречается, когда компьютер только запускается, потому что кеш компьютера пуст, поэтому кеш промахивается Давайте возьмем очевидный пример по второй причине, предположив, что теперь есть адрес Для компьютера с длиной из 16 бит, бит метки t=3, бит индекса s=5 и бит смещения b=8. Если мы посетим два таких адреса:
A=121 111 00021
B=131 111 00022
Будет обнаружено, что хотя адреса A и B различны, в соответствии с вышеуказанными шагами они будут отображаться в один и тот же блок кэша, но кэш пропускается из-за несогласованных битов флага, что называется конфликтом кэша.
Случай записи данных
В приведенных выше абзацах мы все читаем данные, так как же работает изменение кэша данных записи? Поскольку ситуация записи связана с модификацией данных, она должна быть сложнее, чем ситуация чтения.Если мы хотим сейчас записать по адресу А, у нас есть два решения.
1. Отказаться от кеша и писать напрямую в основную память
2. Запись кеша
Если мы выбираем первый случай, то прямая запись в порядке, но она возвращается к началу проблемы, скорость записи слишком низкая, и процессору приходится долго ждать. Тогда, конечно, мы используем второй случай. Данные сначала считываются в кеш, а затем записываются в кеш. Затем нам нужно обратить внимание на проблему в этом случае: проблема синхронизации кеша на разных уровнях, то есть, когда в этом блоке кеша возникает конфликт кеша, блок кеша должен быть сброшен в его кеш следующего уровня, когда данные перезаписываются.
резюме
Благодаря приведенному выше описанию я думаю, что принцип работы кэша уже должен иметь в моем сознании блок-схему. Так какой же смысл знать, как кэширование работает на практике? Это восходит к принципу локальности, о котором мы говорили в начале.Поскольку компьютер всегда кэширует непрерывный адрес (кэш-блок), если код, который мы пишем, соответствует принципу локальности, эффективность работы будет значительно повышена.Улучшить, который дает рекомендации по оптимизации производительности нашей программы.
Например
如果遍历一个长度相同数组和一个链表,由于数组在物理存储上是连续的,遍历数组时效率会更快