Я набрал это письмо, чтобы кто-нибудь объяснил кеши, но я думаю, что вы также найдете его полезным.
У вас есть 32-битные адреса, которые могут ссылаться на байты в оперативной памяти.
Вы хотите иметь возможность кэшировать данные, к которым вы обращаетесь, чтобы использовать их позже.
Допустим, вам нужен кэш объемом 1 МБ (2 20 байт).
Что ты делаешь?
У вас есть 2 ограничения, которые вы должны выполнить:
- Кэширование должно быть как одинаковым , насколько это возможно, по всем адресам. то есть вы не хотите склоняться к какому-либо конкретному виду адреса.
- Как ты это делаешь? Используйте остаток! С модом вы можете равномерно распределить любое целое число в любом диапазоне.
- Вы хотите помочь минимизировать бухгалтерские расходы. Это означает, например, если вы кешируете блоки по 1 байту, вам не нужно хранить 4 байта данных, чтобы отслеживать, где находится 1 байт.
- Как ты это делаешь? Вы храните блоки, размер которых превышает 1 байт.
Допустим, вы выбрали 16-байтовые (2 4 -байтовые) блоки. Это означает, что вы можете кэшировать 2 20 / 2 4 = 2 16 = 65 536 блоков данных.
Теперь у вас есть несколько вариантов:
- Вы можете спроектировать кеш так, чтобы данные из любого блока памяти могли храниться в любых блоков кеша. Это можно назвать полностью ассоциативным кэшем.
- Преимущество заключается в том, что это «самый справедливый» тип кэша: все блоки обрабатываются абсолютно одинаково.
- Компромисс - скорость: чтобы найти, куда поместить блок памяти, вы должны искать каждый блок кэша на наличие свободного места. Это действительно медленно.
- Вы можете спроектировать кэш так, чтобы данные из любого блока памяти могли только храниться в одном блоке кэша. Это будет называться кешем с прямым отображением.
- Преимущество заключается в том, что это самый быстрый вид кэша: вы делаете только 1 проверку, чтобы увидеть, находится ли элемент в кэше или нет.
- Компромисс заключается в том, что теперь, если вам случается иметь неправильный шаблон доступа к памяти, вы можете иметь 2 блока, последовательно выбивающих друг друга, при этом неиспользуемые блоки все еще остаются в кэше.
- Вы можете сделать смесь обоих: отобразить один блок памяти на несколько блоков. Это то, что делают настоящие процессоры - они имеют N-образный набор ассоциативных кэшей.
Кэш прямого отображения:
Теперь у вас есть 65 536 блоков данных, каждый блок состоит из 16 байтов.
Вы храните его как 65 536 «строк» внутри своего кэша, причем каждая «строка» состоит из самих данных и метаданных (относительно того, где находится блок, является ли он действительным, был ли он записан и т. Д.).
Вопрос:
Как каждый блок в памяти отображается на каждый блок в кэше?
Ответ:
Ну, вы используете кэш с прямым отображением, используя мод. Это означает, что адреса от 0 до 15 будут отображаться в блоке 0 в кеше; 16-31 сопоставляются с блоком 2 и т. Д., И он приближается к отметке 1 МБ.
Итак, учитывая адрес памяти M, как найти номер строки N? Легко: N = M% 2 20 / 2 4 .
Но это говорит только о том, где хранить данных, а не как извлекать данных. После того, как вы сохранили его и попытаетесь получить к нему доступ снова, вы должны знать , какая 1-МБ часть памяти была сохранена здесь, верно?
Так что это одна часть метаданных: биты тега. Если он находится в строке N, все, что вам нужно знать, это то, что было частным во время работы мода. Что для 32-разрядного адреса составляет 12 бит (поскольку остаток составляет 20 бит).
Таким образом, ваш тег становится длиной 12 бит - в частности, самый верхний 12 бит любого адреса памяти.
И вы уже знали, что самые младшие 4 бита используются для смещения в пределах блока (поскольку память имеет байтовый адрес, а блок имеет 16 байтов).
То есть 16 битов для индекса "msgstr "биты адреса памяти, которые можно использовать для поиска , к которой строка принадлежит адресу.(Это просто операция деления + остатка, но в двоичном виде.)
Вам также нужны другие биты: например, вам нужно знать, является ли блок действительным или нет, потому что, когда процессор включен, онсодержит неверные данные.Таким образом, вы добавляете 1 бит метаданных: действительный бит.
Есть другие биты, о которых вы узнаете, которые используются для оптимизации, синхронизации и т. Д., Но это основные.:)