Кэш

Кэш — это один из уровней памяти устройства или программы. Это высокоскоростное буферное хранилище, в котором располагаются нужные данные. Обычно кэш небольшого размера, и в нем хранится временная информация или та, к которой обращаются чаще всего.

Процесс помещения информации в кэш называется кэшированием.

Кэш есть в компьютерах и мобильных телефонах, отдельные кэши есть у программ, например у браузеров и веб-приложений. Он важен, потому что позволяет быстрее получать доступ к часто используемым данным, оптимизирует и ускоряет работу.

Аппаратный кэш устройства — сервера, компьютера или телефона — это специальный участок памяти с особой архитектурой. Кэш приложений и сервисов — чаще всего программный: он хранится в обычной памяти, в папках на устройстве или на отдельных серверах. Скорость доступа оптимизируется с помощью кода.

Кто пользуется кэшем

В широком смысле кэш используют все, у кого есть компьютер или мобильное устройство. Во всех этих девайсах есть аппаратный кэш, которым пользуется система, и программные кэши приложений. Например, кэш браузера, позволяющий быстрее открывать страницы.

В узком смысле кэшем занимаются разработчики, создающие то или иное приложение или программу. Они могут непосредственно писать логику кэширования и определять порядок хранения файлов. С кэшем на разных уровнях также могут работать системные или сетевые инженеры, архитекторы, проектировщики и другие специалисты.

Для чего нужен кэш

В кэше сохраняются данные, к которым программа или устройство обращаются часто. Если бы кэша не было, эти данные пришлось бы читать из обычной памяти или, в случае веба, скачивать из сети. Как результат — более долгая загрузка, большая нагрузка на память или на сеть. Тем более, таких данных может быть много: без кэша скорость работы компьютеров и их приложений была бы намного меньше.

Поэтому кэшем пользуется большинство приложений, которые оперируют большим набором данных. Это браузеры, разнообразные мессенджеры, программы, работающие с сетью или информацией, СУБД и другие.

Аппаратный кэш есть практически во всех компьютерных устройствах: без него операционная система не сможет работать как надо.

Как устроен кэш 

Внутреннее устройство кэша похоже на базу данных с более простой структурой и своими особенностями. Это перечень записей с информацией. Данные в них — копии данных, которые есть в «обычной» памяти или на серверах. У каждой записи есть свой идентификатор, или тег, — он показывает, в каком участке «обычной» памяти расположена эта же информация.

Когда системе или программе нужны данные, она находит их по идентификатору. Сначала она проверяет кэш: если в памяти обнаружилась запись, имеющая соответствующий тег, информация берется оттуда. Это быстрее. Если в кэше таких данных нет, значит, нужно обратиться по этому же идентификатору в «обычную» память или на сервер, а затем поместить в кэш полученные оттуда данные. Так в следующий раз обращение к ним будет быстрее.

Алгоритмы кэширования и вытеснения различаются в зависимости от реализации, и их мы обсудим позже.

Виды кэша

Аппаратная реализация используется процессором, системой, различными низкоуровневыми, то есть близкими к «железу» процессами. Кэш-память отличается от обычного хранилища данных на физическом уровне, она принципиально другая.

Программная реализация используется программами и сервисами. У каждого приложения она своя. Это по сути код, который описывает, как размещать, кэшировать и хранить данные. При этом сама информация находится в обычных участках памяти: на жестком диске, SSD, сервере. На аппаратном, «железном» уровне такой кэш практически не отличается от простого хранилища данных.

Если о кэше заходит речь в контексте веба, баз данных и других подобных систем, то обычно имеется в виду программный. С аппаратными кэшами работают инженеры и низкоуровневые программисты.

Устройство аппаратного кэша

Кэш процессора. У процессора есть понятие тактовой частоты — это то, с какой скоростью операции выполняются на физическом уровне. В современной технике тактовая частота очень высокая, но постоянные обращения к «обычной» памяти сводили бы эту скорость на нет. Чтобы работа была эффективнее, в процессорах предусматривают кэш. На этом уровне он еще называется сверхоперативной памятью и иначе устроен с точки зрения физики. Мы не будем углубляться в сложные технические детали, просто скажем, что доступ к любой ячейке данных в такой памяти обычно занимает одно и то же время.

Особенность сверхоперативной памяти — она энергозависима. Это значит, что такой кэш поддерживается, только пока устройство включено. Если выключить компьютер, содержимое этой памяти очистится, как и в случае с оперативной. После повторного включения содержимое кэша окажется непредсказуемым.

Процессорный кэш обычно разделен на уровни от первого, самого быстрого, до четвертого. Меньше уровней в конкретном процессоре может быть, больше — нет. У большинства устройств только три уровня.

Кэш внешних устройств. Аппаратный кэш также может быть у внешних хранилищ, например жестких дисков. Он опять же обеспечивает более быстрый доступ к памяти. Кроме того, сама система при работе с внешним накопителем может пользоваться частью оперативной памяти компьютера как «дисковым кэшем».

Устройство программного кэша

Программный кэш какого-либо приложения описывается кодом. Кэшированные данные иначе записываются, хранятся в особых структурах данных, и доступ к ним происходит по определенным оптимизированным алгоритмам.

Особенности записи данных. Информацию в программный кэш записывают одним из двух способов:

  • сквозной — сначала полученные сведения оказываются в основной памяти, а потом оттуда дублируются в кэш;
  • отложенный — сначала данные кэшируются, а потом, по истечении определенного срока или при вытеснении, переносятся в основную память.

Структуры для хранения кэша. Для хранения закэшированных данных обычно используются программные структуры с более быстрым доступом, чем к стандартным файлам или переменным. Чаще всего это ассоциативные массивы или хэш-таблицы — о них вы подробнее можете прочитать в соответствующих статьях. В небольших программах они могут быть заданы как переменные, но чаще представляют собой нечто вроде простой базы данных в памяти устройства. Также это могут быть отдельные файлы и папки, где хранится информация.

Ассоциативные структуры данных используются потому, что позволяют хранить пары «ключ-значение», где ключ может быть числом, текстом, хэшем или чем-то еще. Доступ к ним производится по особым алгоритмам и благодаря этому оказывается быстрее.

Алгоритмы кэширования. Одна из особенностей кэша — это относительно небольшой участок памяти. Если он становится слишком объемным, то начинает занимать слишком много места, может ухудшиться и быстродействие. Так что размер программного кэша ограничивают. А если он оказывается заполнен, срабатывают алгоритмы вытеснения — какая-то информация «выбрасывается» из него, а новая записывается.

Алгоритмов, которые описывают добавление и вытеснение, несколько. Наиболее известных — четыре:

  • MRU — убираются данные, которые испольовались последними;
  • LFU — вытесняются данные, которые используются реже всего;
  • LRU — вытесняются данные, к которым не обращались дольше всего;
  • ARC — комбинация двух предыдущих типов.

Существует теоретический алгоритм, который невозможно реализовать в общем виде: отбрасываться должна наименее полезная информация. Он называется алгоритмом Белади. Реализация невозможна, потому что компьютер не сможет предвидеть, какая информация более или менее полезна. Существующие алгоритмы приближают к теоретическому в зависимости от особенностей работы конкретной программы.

Примеры программного кэша

Это только несколько примеров. Сфера использования кэш-памяти как концепта намного шире, мы только привели несколько наглядных вариантов.

Кэш браузера. Браузер открывает сайты. Если упростить: чтобы отобразить страницу как надо, он скачивает информацию с ее сервера и показывает вам. Этот процесс занимает время и отнимает ресурсы: нужно обратиться к сети, получить ответ, подгрузить и отобразить контент. Поэтому, чтобы ускорить загрузку, часть данных кэшируется.

Кэш браузера — это обычно папка в каталоге, где находятся его файлы. В кэше хранятся локальные копии некоторых данных с сайтов, на которых вы находились. Какие именно это данные, зависит от браузеров, но чаще всего сохраняются сведения, которые много весят и редко изменяются. Это картинки, участки видеороликов, графические элементы интерфейса. Если человек зайдет на сайт, данные которого закэшировались, то сможет получить к ним доступ быстрее и это не потребует активного скачивания «тяжелой» информации из сети.

Иногда браузерный кэш нужно очищать — например, если он закэшировал страницу, на которой была ошибка, и теперь все время показывает ее как ошибочную. Это можно сделать через настройки самого браузера.

Сетевой кэш. Им обычно пользуются крупные ресурсы, на которые заходят из разных точек мира. На самом низком уровне все происходящее в вычислительной технике – электрические импульсы, а у них есть конечная скорость. Поэтому, если компьютер в какой-то части мира захочет обратиться к компьютеру в противоположном полушарии, данные будут идти дольше.

Для разрешения этой проблемы используют CDN, сети доставки контента. Это распределенная система из большого количества устройств, которые находятся в разных точках мира. По сути, это кэш с хранением данных в разных местах.

Такое использование кэша позволяет сайтам быстро загружаться из любой точки мира: устройства находятся в разных странах и на разных материках. С CDN работают соответствующие специалисты, повлиять на их использование простой пользователь не может.

Кэш серверной части сайта. В веб-разработке кэш может быть не только браузерным. У самих владельцев ресурса есть еще один способ ускорить доступ к страницам. Это использование специального кэш-сервера: он кэширует контент, соответствующий самым популярным запросам. В результате те страницы, которые пользователи посещают часто, будут загружаться у них быстрее, а это полезно сразу по многим причинам. Это делает сайт более удобным, помогает его ранжированию, улучшает пользовательский опыт.

К серверному кэшу нет доступа у обычного пользователя. С ним могут соприкасаться бэкендеры и другие специалисты, работающие непосредственно с «внутренней» частью сайта.

Кэш программ, работающих с памятью. Приложения могут использовать кэш как способ хранить свои внутренние данные, к которым нужен быстрый доступ. Это, например, промежуточные результаты каких-то вычислений или действий — они понадобятся в дальнейшем. Или параметры, которые нужно передавать разным модулям.

Кэш приложения может представлять собой папку с файлами на устройстве, а может существовать в рамках кода — тогда это какая-либо переменная или структура данных.

Преимущества кэша

Кэш — нечто обязательное для современных компьютеров, серверов, веб-приложений и других сущностей. Без него интернет и в целом IT не функционировали бы как надо. Вот какие преимущества дает его использование.

Повышение производительности. С кэшем приложения работают быстрее и эффективнее: им не приходится постоянно тратить время на подгрузку каких-то данных, ведь они могут просто взять их из кэша. Иначе все постоянно зависало бы, приходилось бы долго ждать.

Снижение нагрузки. Так как к основному хранилищу благодаря кэшу обращаются реже, на него снижается нагрузка. Это особенно важно в случае с серверами, так как помогает избежать отказов и резкого снижения производительности из-за нагрузки в пиковых ситуациях.

Повышение пропускной способности. Как следствие всего перечисленного, повышается пропускная способность операций. Дело в том, что чтение и запись данных — операции, которые занимают время и могут выполняться только в определенном количестве за момент времени. У кэша пропускная способность намного выше, чем у обычной памяти, поэтому операций за один момент может быть множество — намного больше, чем при работе с сервером, базой данным или другим хранилищем.

Оптимизация. Представьте себе, что к каким-то данным обращаются чаще, чем к другим. Это может быть определенная популярная страница сайта или какая-то информация из приложения, что-то еще. Если эти данные будут храниться в обычной памяти, это создаст лишнюю нагрузку и снизит скорость доступа. А их кэширование позволяет оптимизировать доступ и сделать нагрузку более равномерной.

Меньшие затраты. Это опять же преимущество, важное для веба. Использование серверного или сетевого кэша приводит к тому, что сервису нужно платить за меньшее количество ресурсов для базы данных или серверов. Несмотря на то что сам кэш тоже не бесплатный, выходит тем не менее дешевле, чем без него.

Недостатки кэша

  • Аппаратный кэш — очень дорогая в производстве структура. К тому же он обычно энергозависим: стоит выключить устройство — все данные потеряются.
  • Программный кэш не решит всех вопросов, связанных с памятью. Он ограничен по размеру, а специфические алгоритмы не позволяют хранить в нем что-то неограниченное количество времени. Для долговременного хранения важной информации он не подходит.
  • Алгоритма кэширования, оптимального в любых ситуациях, не существует. Поэтому алгоритм выбирают разработчики в зависимости от целей конкретной программы: он обычно довольно узкоспециализированный и не подходит для широкого спектра задач.
  • Закэшировать «весь интернет» или всю память не получится — размер кэша довольно маленький.

Это не минусы в классическом понимании: кэшем все равно пользуются все. Просто надо понимать, что это специализированный инструмент со своей сферой использования.

Как реализован кэш

Аппаратный кэш реализуется на уровне полупроводников и электрических схем. Программный куда разнообразнее.

Кэширование в приложении может быть устроено как хранение данных в специальных структурах, существующих в коде, или как сохранение информации в отдельные файлы и папки. Соответственно, код описывает то, как данные добавляются и удаляются из кэша.

В случае с сетевой инфраструктурой обычно используются специальные сервисы. Они предоставляют сайту мощности кэш-памяти или кэш-сервер за определенную абонентскую плату.

В разработке также применяют API и фреймворки, в которых есть реализации программного кэша разных типов. Такие инструменты позволяют не писать реализацию с нуля, а чтобы начать работать с ними, понадобится изучить соответствующую технологию.

Как начать работать с кэшем

Чтобы написать собственную реализацию программного кэша в самом простом виде, понадобится изучить алгоритмы его наполнения и особенности хранения данных. Тогда вы сможете создать код, который реализует максимально простой кэш.

Для более сложных решений понадобится пользоваться фреймворками и соответствующими технологиями. А при создании веб-архитектуры, возможно, придется арендовать кэш-сервер для сайта или базы данных — но это уже более продвинутый уровень, таким занимаются владельцы ресурсов и старшие специалисты.

(рейтинг: 5, голосов: 1)
Добавить комментарий