Кэш-память
Кэш-память (англ. cache memory, от фр. cacher — прятать) — это сверхбыстрая, но небольшая по объёму память, используемая процессором компьютера или другого электронного устройства для временного хранения часто используемых данных и инструкций. Кэш-память служит промежуточным буфером между быстрым процессором и более медленной оперативной памятью (ОЗУ), позволяя существенно сократить время доступа к данным и повысить общую производительность системы.
Принцип работы
Основная идея кэширования основана на принципе локальности обращений. Этот принцип проявляется в двух формах:
- Пространственная локальность: если программа обратилась к некоторой ячейке памяти, то с высокой вероятностью в ближайшее время она обратится к соседним ячейкам.
- Временная локальность: если программа обратилась к некоторой ячейке, то с высокой вероятностью она обратится к ней снова в ближайшем будущем.
Процессор, обращаясь к данным, сначала проверяет, есть ли запрашиваемая информация в кэш-памяти. Если данные там присутствуют (это называется кэш-попадание, или cache hit), то они извлекаются из кэша за минимальное время (обычно 1-3 такта процессора). Если данных в кэше нет (кэш-промах, или cache miss), процессор вынужден обращаться к более медленной оперативной памяти (ОЗУ), что занимает десятки и сотни тактов. При этом из ОЗУ в кэш загружается не только запрошенный блок данных, но и целая строка кэша (обычно 64 байта), чтобы воспользоваться пространственной локальностью.
История
Первые идеи кэширования появились в 1960-х годах. В 1968 году Морис Уилкс в своей статье «Slave Memories and Dynamic Storage Allocation» предложил концепцию использования небольшой быстрой памяти для ускорения доступа к основной. Первым коммерческим компьютером, реализовавшим кэш-память, стал IBM System/360 Model 85 (1968 год), где кэш назывался «буфером памяти» (memory buffer). В процессорах для персональных компьютеров кэш-память появилась в начале 1990-х годов: процессор Intel 80486 имел встроенный кэш первого уровня (L1) объёмом 8 Кбайт.
Уровни кэш-памяти
Современные процессоры имеют многоуровневую иерархию кэш-памяти, которая включает от двух до четырёх уровней (L1, L2, L3, L4). Каждый последующий уровень больше по объёму, но медленнее по скорости доступа.
Кэш первого уровня (L1)
- Объём: обычно 32–128 Кбайт на ядро.
- Скорость: минимальная задержка (1–3 такта процессора).
- Расположение: непосредственно на кристалле процессора, разделён на кэш инструкций (L1i) и кэш данных (L1d).
Кэш второго уровня (L2)
- Объём: обычно 256–512 Кбайт на ядро (в современных процессорах может достигать 1–2 Мбайт на ядро).
- Скорость: задержка 5–12 тактов.
- Расположение: на кристалле процессора, может быть как индивидуальным для каждого ядра, так и общим для нескольких ядер.
Кэш третьего уровня (L3)
- Объём: обычно 8–32 Мбайт (в серверных процессорах до 64–256 Мбайт).
- Скорость: задержка 20–50 тактов.
- Расположение: общий для всех ядер процессора, на кристалле.
Кэш четвёртого уровня (L4)
- Объём: до 128–256 Мбайт.
- Скорость: задержка 50–100 тактов.
- Расположение: может быть как на кристалле, так и в виде отдельного чипа (например, в процессорах Intel с технологией Crystal Well или в некоторых серверных решениях). Встречается редко, обычно в высокопроизводительных системах.
Классификация по архитектуре
Кэш-память классифицируется по способу отображения данных из оперативной памяти:
Кэш с прямым отображением (Direct-mapped cache)
Каждый блок оперативной памяти может быть помещён только в одну строго определённую строку кэша. Простая и быстрая схема, но приводит к большому числу конфликтов (кэш-промахов), если несколько часто используемых данных отображаются на одну и ту же строку.
Полностью ассоциативный кэш (Fully associative cache)
Любой блок памяти может быть помещён в любую строку кэша. Минимизирует конфликты, но требует сложной схемы сравнения адресов, что замедляет работу и увеличивает энергопотребление. Применяется в небольших кэшах (например, TLB — буфер ассоциативной трансляции).
Множественно-ассоциативный кэш (Set-associative cache)
Компромиссный вариант: кэш разбивается на наборы (sets), каждый из которых содержит несколько строк (ways). Блок памяти может быть помещён в любую строку внутри одного набора. Современные процессоры используют 4-х, 8-ми или 16-канальный множественно-ассоциативный кэш.
Алгоритмы замещения
Когда все строки кэша заняты, а необходимо загрузить новый блок данных, система должна выбрать, какую строку удалить. Основные алгоритмы:
- LRU (Least Recently Used) — вытесняется строка, к которой дольше всего не было обращений. Обеспечивает хорошую эффективность, но требует дополнительных ресурсов для отслеживания времени обращений.
- LFU (Least Frequently Used) — вытесняется строка с наименьшей частотой обращений.
- FIFO (First In, First Out) — вытесняется самая старая строка.
- Random — случайный выбор. Простой, но менее эффективный алгоритм.
Когерентность кэша
В многопроцессорных и многоядерных системах возникает проблема когерентности кэша: когда одно ядро изменяет данные в своём кэше, другие ядра должны получить уведомление об этом, чтобы не использовать устаревшие данные. Для решения этой проблемы используются протоколы когерентности, наиболее распространённый из которых — MESI (Modified, Exclusive, Shared, Invalid). Каждая строка кэша помечается одним из четырёх состояний, что позволяет отслеживать изменения и синхронизировать данные между ядрами.
Применение
Кэш-память используется не только в центральных процессорах, но и в других устройствах:
- Графические процессоры (GPU) — имеют собственную иерархию кэша (L1, L2) для ускорения обработки графики и вычислений.
- Жёсткие диски и SSD — используют кэш-память (обычно 16–256 Мбайт) для временного хранения часто запрашиваемых блоков данных.
- Веб-браузеры — кэшируют веб-страницы, изображения и другие ресурсы для ускорения загрузки при повторных посещениях.
- DNS-серверы — кэшируют результаты запросов для уменьшения времени ответа.
- Процессоры в мобильных устройствах — используют кэш для снижения энергопотребления и повышения быстродействия.
Характеристики и производительность
Эффективность кэш-памяти оценивается по нескольким параметрам:
- Коэффициент попаданий (hit rate) — процент обращений, при которых данные найдены в кэше. В современных процессорах для кэша L1 он составляет 90–95%, для L2 — 80–90%, для L3 — 50–70%.
- Время доступа (latency) — задержка при кэш-попадании.
- Штраф за промах (miss penalty) — время, необходимое для загрузки данных из ОЗУ в кэш.
- Среднее время доступа — вычисляется как: (hit rate × latency) + (miss rate × miss penalty).
Критика и ограничения
Несмотря на значительное ускорение работы, кэш-память имеет ряд ограничений:
- Ограниченный объём — при работе с большими массивами данных, не укладывающимися в кэш, эффективность резко падает.
- Сложность проектирования — увеличение объёма кэша и его ассоциативности ведёт к росту числа транзисторов, энергопотребления и тепловыделения.
- Проблемы безопасности — в 2018 году были обнаружены уязвимости Spectre и Meltdown, которые использовали особенности работы кэш-памяти для несанкционированного доступа к данным других процессов.
- Закон убывающей отдачи — увеличение объёма кэша сверх определённого порога даёт всё меньший прирост производительности.
Интересные факты
- В процессорах Intel Core i9-13900K (2022 год) используется 32 Мбайт кэша L2 и 36 Мбайт кэша L3.
- В серверных процессорах AMD EPYC 9004 (2022 год) объём кэша L3 достигает 384 Мбайт.
- Термин «кэш» (cache) ввёл в обиход в 1967 году сотрудник IBM Лайл Джонсон, предложивший использовать французское слово «cacher» (прятать) для описания скрытой от программиста быстрой памяти.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →