Кеш в информатике и вычислительной технике¶
Кеш (от англ. cache — «хранилище», «тайник») — это сверхбыстрая память или буфер, в котором временно хранятся копии часто используемых данных с целью ускорения доступа к ним. Кеширование применяется на всех уровнях вычислительных систем: от процессорных регистров до веб-серверов и распределённых систем.
¶Принцип работы
Кеш работает по принципу локальности: если программа обратилась к некоторым данным, скорее всего, она вскоре обратится к ним снова (временная локальность) или к соседним данным (пространственная локальность). При обращении к данным система сначала проверяет кеш; при попадании (hit) данные возвращаются за считанные такты, при промахе (miss) — загружаются из более медленного носителя и помещаются в кеш для будущих обращений.
Основные характеристики кеша:
- Латентность — время доступа (обычно от 1 нс до нескольких десятков нс);
- Пропускная способность — объём данных, передаваемый за единицу времени;
- Объём — размер хранимых данных;
- Политика замещения — правило выбора данных для вытеснения при заполненном кеше.
¶Уровни кеша в процессоре
В современных процессорах кеш организован иерархически:
| Уровень | Объём | Латентность | Расположение |
|---|---|---|---|
| L1 | 32–128 КБ на ядро | 1–4 такта | Внутри ядра |
| L2 | 256 КБ – 2 МБ на ядро | 4–12 тактов | Внутри ядра или рядом |
| L3 | 8–128 МБ на кристалл | 20–60 тактов | Общий для всех ядер |
Кеш L1 обычно разделён на инструкционный (L1i) и данных (L1d). При нескольких ядрах каждый имеет собственные L1 и L2, а кеш L3 — общий. Когерентность кешей разных ядер поддерживается протоколами MESI, MOESI и аналогичными.
¶Политики кеширования
Политика записи:
- Write-through — запись одновременно в кеш и в основную память. Простая, но нагружающая шину.
- Write-back — запись только в кеш, в память данные попадают при вытеснении. Быстрее, но сложнее при сбоях.
- Write-allocate — при промахе на запись блок сначала загружается в кеш.
Политика замещения:
- LRU (наименее недавно использованный) — вытесняется блок, к которому дольше всего не обращались;
- FIFO — вытесняется самый старый блок;
- Random — случайный выбор;
- LFU (наименее часто используемый).
¶Кеширование в программировании и базах данных
В программных системах кеш — это слой хранения результатов дорогостоящих операций. Типичные примеры:
- Кеш запросов к БД — результат SQL-запроса сохраняется в памяти (Redis, Memcached) и переиспользуется при повторных идентичных запросах;
- Кеш вычислений — мемоизация: результат функции сохраняется по ключу-аргументам;
- Кеш HTTP — браузеры и прокси-серверы хранят ответы сервера, используя заголовки
Cache-Control,ETag,Expires; - Кеш DNS — резолверы кешируют соответствие доменных имён и IP-адресов на время TTL.
¶Кеш в распределённых системах
В крупных веб-системах кеш организуется в несколько уровней: браузерный кеш, кеш CDN (например, Cloudflare, Akamai), кеш приложения (Redis, Memcached) и кеш базы данных. Распределённые кеши, такие как Redis, поддерживают структуры данных (строки, хеш-таблицы, списки), TTL-истечение, публикацию/подписку и кластеризацию.
Проблемы распределённого кеша — когерентность (устаревание данных при нескольких узлах) и «прогрев» кеша после перезапуска, когда все узлы начинают с пустым хранилищем.
¶Кеш в операционных системах
Операционные системы кешируют:
- Страницы памяти — механизм виртуальной памяти, подгружающий страницы с диска по требованию;
- Файловый кеш (page cache) — содержимое файлов хранится в оперативной памяти, что ускоряет повторные чтения;
- Кеш каталогов — результаты поиска файлов по именам;
- Swap-файлы — выгруженные страницы.
¶Негативные эффекты кеширования
- Устаревание данных — кеш может возвращать неактуальную информацию, если инвалидация не настроена;
- Кеш-пробивание (cache stampede) — при одновременном истечении TTL множество запросов одновременно обращаются к источнику, создавая нагрузку;
- Кеш-отравление — атакующий подсовывает в кеш вредоносные или заведомо ложные данные;
- Неравномерное распределение — в кластерах часть узлов перегружена, другая простаивает.
¶История
Термин «кеш» в вычислительной технике ввёл Морис Уилкс в 1965 году, описав его в работе о проектировании ЭВМ как буфер между процессором и медленной памятью. Первый коммерческий процессор с кешем — Intel 80486 (1989), имевший встроенный кеш L1 объёмом 8 КБ.
¶Источники
- Уилкс М. «Computer Designed with Cache Memory» (1965)
- Хеннесси Дж., Паттерсон Д. «Архитектура компьютера: подход на основе количественного анализа»
- Сайт Intel — документация по архитектуре кешей процессоров
- RFC 9111 — HTTP Caching
- Документация Redis
