Открыть сервисСервис

Кеш в информатике и вычислительной технике

Кеш (от англ. cache — «хранилище», «тайник») — это сверхбыстрая память или буфер, в котором временно хранятся копии часто используемых данных с целью ускорения доступа к ним. Кеширование применяется на всех уровнях вычислительных систем: от процессорных регистров до веб-серверов и распределённых систем.

Принцип работы

Кеш работает по принципу локальности: если программа обратилась к некоторым данным, скорее всего, она вскоре обратится к ним снова (временная локальность) или к соседним данным (пространственная локальность). При обращении к данным система сначала проверяет кеш; при попадании (hit) данные возвращаются за считанные такты, при промахе (miss) — загружаются из более медленного носителя и помещаются в кеш для будущих обращений.

Основные характеристики кеша:

  • Латентность — время доступа (обычно от 1 нс до нескольких десятков нс);
  • Пропускная способность — объём данных, передаваемый за единицу времени;
  • Объём — размер хранимых данных;
  • Политика замещения — правило выбора данных для вытеснения при заполненном кеше.

Уровни кеша в процессоре

В современных процессорах кеш организован иерархически:

УровеньОбъёмЛатентностьРасположение
L132–128 КБ на ядро1–4 тактаВнутри ядра
L2256 КБ – 2 МБ на ядро4–12 тактовВнутри ядра или рядом
L38–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
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru