Сегодня поговорим о том, как работает кэширование. Наши читатели уже знакомы с иерархией компьютерной памяти и с тем, что кэш занимает в ней очень высокую ступеньку. Настала пора поближе познакомиться с самим принципом кэширования. Современные компьютеры могут похвастаться не только кэшем первого (L1) и 2 (L2), но и третьего уровня (L3). Рассмотрим те задачи, которые выполняет компьютерный кэш, на примере рабочего дня библиотекаря в обычной, слегка старомодной библиотеке, где хранятся накопленные человечеством знания в виде бумажных томов.
Основная сложность в том, что «компьютерный кэш» понятие слишком многозначное и порой одним и тем же словом обозначают разные вещи. Достаточно сказать, что существует не только кэш памяти, но также аппаратный и программный дисковый кэш, кэш страниц и многие другие компьютерные процессы, объединенные общим именем. Например, виртуальная память тоже является одной из форм кэширования. Поэтому кэш процессора не единственный имеющийся в компьютере кэш. Кэширование играет гигантскую роль в работе всего компьютера в целом.
Кэширование на примере обычной библиотеки

Технология кэширования базируется на подсистеме компьютерной памяти. Основная задача этой важной технологии состоит в том, чтобы заставить ваш компьютер работать быстрее. Даже в том случае, если это не самый мощный (и, соответственно, дорогой) компьютер. Благодаря кэшированию повышается скорость выполнения компьютером своих задач.
Чтобы понять основную идею рассматриваемой технологии, обратимся к простому примеру из жизни. Представим себе библиотекаря, который выдает читателям книги по их запросам. Читателю не приходится самому долгие часы бродить по гигантскому залу библиотеки и искать нужные книги.
Посетитель пришел в библиотеку и попросил выдать ему учебник по алгебре. Библиотекарь отправляется в зал, берет эту книгу с полки, возвращается на свое рабочее место и выдает книгу читателю. Проходит некоторое время и человек идет из читального зала к столу библиотекаря, чтобы вернуть книгу. Библиотекарь берет учебник и возвращает его на полку. И снова садится за свой стол, ожидая очередного читателя.
Новому посетителю может понадобиться все тот же учебник по алгебре. Библиотекарю придется снова пойти в книгохранилище, взять книгу с полки, вернуться на рабочее место и выдать ее человеку, которому она необходима.
Как мы видим на этом примере, для того чтобы выдать читателю литературу, библиотекарю приходится проделывать 1 и ту же определенную последовательность действий, даже в том случае, когда речь идет о книге, которая пользуется повышенным спросом.
Есть ли способ облегчить библиотекарю его труд? Да! Для этого нужно создать «библиотечный кэш», и далее мы рассмотрим, как это сделать.
Для этого библиотекарю следует выдать сумку, в которой поместится, допустим, 10 книг. В рамках компьютерной терминологии, можно сказать, что библиотекарь располагает «10-книжным кэшем». В эту сумку библиотекарь станет складывать возвращаемые ему читателями книги, но не более 10 . Это значит, что за наиболее популярными не придется каждый раз идти в хранилище, поскольку они всегда под рукой.
В начале рабочего дня «кэш-сумка» библиотекаря пуста. Приходит 1 читатель и просит учебник алгебры. Библиотекарь отправляется в книгохранилище и возвращается с запрошенной книгой. Ничего нового, всё, как в предыдущем примере. Через некоторое время читатель возвращает учебник библиотекарю, но он не ставит его на полку в хранилище, а отправляет в сумку. Итак, кэш уже не пуст, в нем есть содержимое.
Приходит очередной читатель, которому необходим учебник алгебры. Вместо того, чтобы в очередной раз проделать путь от своего стола к полке, где находится книга, библиотекарь проверяет свою сумку и обнаруживает ее там. Ему достаточно извлечь книгу из сумки и выдать ее читателю. Утомительное путешествие в книгохранилище отменяется! Лишнее время не было потрачено и читатель получил книгу намного быстрее, чем в предыдущем примере.
Но может случиться так, что посетителю потребуется книга, которой в сумке нет. В этом случае кэш увеличит время поиска, поскольку библиотекарю понадобится сначала проверить свою сумку, а лишь затем (убедившись, что нужной книги там нет) отправиться в хранилище к соответствующей полке. 1 из самых сложных задач инженеров состоит в том, чтобы свести вызываемую проверкой кэша задержку к минимуму. Даже в рассмотренном нами примере, время, которое займет проверка сумки (время латентности), весьма невелико по сравнению с долгим путешествием в хранилище книг и обратно. В данном случае кэш невелик (всего 10 книг). К слову, латентность является одним из основных ограничений компьютерной памяти, о которых мы ранее писали.
Эти простые и понятные каждому примеры раскрывают нам некоторое факты, которые следует знать о технологии кэширования:
В технологии кэширования задействована быстрая память сравнительно малого объема. Она работает в связке с более объемной, но при этом более медленной памятью Использование кэша предполагает проверку, находятся ли в нем нужные данные. Если они там найдены, то говорят о «попадании» (cache hit). Если нет, то это называют «потерпевшим неудачу поиском при обращении к кэшу» или попросту «промахе» (cache miss). В последнем случае компьютеру придется обратиться к медленной памяти большего размера Максимальный размер кэша намного меньше, чем у более ёмких хранилищ информации (например, оперативной памяти или, тем более, жесткого диска) Может быть несколько уровней кэша. В примере с библиотекарем, меньшим, но скоростным типом памяти является его сумка, а книгохранилище выступает в роли объемной, но сравнительно медленной памяти. Это пример одноуровневого кэша. Могут быть добавлены дополнительные слои кэша: например в виде полки на сотню книг непосредственно у стола библиотекаря. Сначала библиотекарь проверит сумку (кэш первого уровня, L1), затем расположенную под рукой полку. И только в том случае, если нужная книга не будет найдена ни там, ни там, он отправится в хранилище. Такой способ организации кэша называется двухуровневым Компьютерное кэширование

Современный компьютер работает с невероятно высокой скоростью. Когда его процессор обращается к оперативной памяти (ОЗУ, RAM), ему требуются считанные наносекунды, то есть миллиардные доли секунды. Предположим, что одно обращение процессора к памяти занимает 60 наносекунд. Это очень быстро, но процессор работает еще быстрее. Даже довольно медленному и порядком устаревшему процессору на 1 такт потребуются всего 2 наносекунды. Далее будем опираться на эти цифры, которые условны и лишь помогут нам сделать повествование более конкретным. К слову, нашим читателям уже известно, что наращивание оперативной памяти не всегда ведет к повышению производительности компьютера.
Что будет, если встроить в материнскую плату специальное хранилище информации, небольшое, но сравнительно быстрое (допустим, на цикл обращения к нему уйдет всего 30 наносекунд). Это уже в 2 раза быстрее того времени, которое потребовалось бы на обращение к оперативной памяти. Такой кэш называется кэшем 2 уровня (или кэшем L2).
А если интегрировать еще меньшую, но еще более скоростную память непосредственно в чип процессора? Получится кэш первого уровня. Обращаться к такой памяти процессор сможет уже на своей скорости. В качестве примера возьмем устаревший процессор Pentium с тактовой частотой 233 мегагерца. Его кэш первого уровня (L1) был быстрее кэша 2 уровня (L2) в 3,5 раза. А тот, в свою очередь, вдвое быстрее времени доступа к оперативной памяти.
В современных процессорах оба уровня кэша зачастую вмонтированы непосредственно в их чипы. В таких случаях на материнской плате появляется кэш третьего уровня (L3), играющий роль своего рода информационного буфера между микропроцессором и системной оперативной памятью.
Компьютер является сложным устройством, содержащим множество подсистем. Если встроить кэш между некоторыми из них, то производительность возрастет. Рассмотрим это на конкретном примере. Итак, перед нами процессор (самый быстрый компонент компьютера). За ним следует кэш первого уровня, затем кэш 2 уровня, который кэширует данные из оперативной памяти. Но и сама оперативная память играет роль кэша для медленных устройств, к которым относятся жесткие и оптические диски.
И жесткому диску тоже приходится порой брать на себя функции кэша (временного хранилища) по отношению к вашему интернет-соединению. Ведь Интернет тоже можно рассматривать в качестве огромной, но не слишком быстрой, «памяти». Хранилище данных, расположенное на ступеньку выше в иерархии компьютерной памяти, может выступать кэшем данных по отношению к более медленному накопителю.
Теперь, когда мы рассмотрели, как работает кэширование, сделаем небольшой перерыв и вернемся к этой теме вновь, чтобы узнать о технологии кэширования и его субсистеме.
Продолжение следует
По материалам computer.howstuffworks.com
Кэш — память (кеш , cash , буфер — eng.) — применяется в цифровых устройствах, как высокоскоростной буфер обмена. Кэш память можно встретить на таких устройствах компьютера как , процессоры, сетевые карты, приводы компакт дисков и многих других.
Принцип работы и архитектура кэша могут сильно отличаться.
К примеру, кэш может служить как обычный буфер обмена . Устройство обрабатывает данные и передаёт их в высокоскоростной буфер, где контроллёр передаёт данные на интерфейс. Предназначен такой кэш для предотвращения ошибок, аппаратной проверки данных на целостность, либо для кодировки сигнала от устройства в понятный сигнал для интерфейса, без задержек. Такая система применяется например в CD/DVD приводах компакт дисков.
В другом случае, кэш может служить для хранения часто используемого кода и тем самым ускорения обработки данных. То есть, устройству не нужно снова вычислять или искать данные, что заняло бы гораздо больше времени, чем чтение их из кэш-а. В данном случае очень большую роль играет размер и скорость кэш-а.

Такая архитектура чаще всего встречается на жёстких дисках, и центральных процессорах (CPU ).
При работе устройств, в кэш могут загружаться специальные прошивки или программы диспетчеры, которые работали бы медленней с ПЗУ (постоянное запоминающее устройство).
Большинство современных устройство, используют смешанный тип кэша , который может служить как буфером обмена, как и для хранения часто используемого кода.
Существует несколько очень важных функций, реализуемых для кэша процессоров и видео чипов.
Объединение исполнительных блоков . В центральных процессорах и видео процессорах часто используется быстрый общий кэш между ядрами. Соответственно, если одно ядро обработало информацию и она находится в кэше, а поступает команда на такую же операцию, либо на работу с этими данными, то данные не будут снова обрабатываться процессором, а будут взяты из кэша для дальнейшей обработки. Ядро будет разгружено для обработки других данных. Это значительно увеличивает производительность в однотипных, но сложных вычислениях, особенно если кэш имеет большой объём и скорость.
Общий кэш , также позволяет ядрам работать с ним напрямую, минуя медленную .
Кэш для инструкций. Существует либо общий очень быстрый кэш первого уровня для инструкций и других операций, либо специально выделенный под них. Чем больше в процессоре заложенных инструкций, тем больший кэш для инструкций ему требуется. Это уменьшает задержки памяти и позволяет блоку инструкций функционировать практически независимо.При его заполнении, блок инструкций начинает периодически простаивать, что замедляет скорость вычисления.
Другие функции и особенности .
Примечательно, что в CPU (центральных процессорах), применяется аппаратная коррекция ошибок (ECC ), потому как небольшая ошибочка в кэше, может привести к одной сплошной ошибке при дальнейшей обработке этих данных.

В CPU и GPU существует иерархия кэш памяти , которая позволяет разделять данные для отдельных ядер и общие. Хотя почти все данные из кэша второго уровня, всё равно копируются в третий, общий уровень, но не всегда. Первый уровень кеша — самый быстрый, а каждый последующий всё медленней, но больше по размеру.
Для процессоров, нормальным считается три и менее уровней кэша. Это позволяет добиться сбалансированности между скоростью, размером кэша и тепловыделением. В видеопроцессорах сложно встретить более двух уровней кэша.
Размер кэша, влияние на производительность и другие характеристики .
Естественно, чем больше кэш , тем больше данных он может хранить и обрабатывать, но тут есть серьёзная проблема.

Большой кеш — это большой бюджет . В серверных процессорах (CPU ), кэш может использовать до 80% транзисторного бюджета. Во первых, это сказывается на конечной стоимости, а во вторых увеличивается энергопотребление и тепловыделение, которое не сопоставимо с увеличенной на несколько процентов производительностью.
Кэш-память процессора позволяет получать данные с очень высокой скоростью, значительно ускоряя вычисления. В кэш – память помещаются данные, которые часто требуются процессору. Это позволяет не затрачивать лишнее время на считывание данных из оперативной памяти. Если процессор запрашивает данные, которые отсутствуют в кэш-памяти, то запрос передается через шину памяти в оперативную память, а затем найденные данные отправляются в процессор. Не трудно догадаться, что на такой запрос уходит довольно много времени. Чтобы рассказать вам, как устроена кэш-память, мы будем использовать аналогию с обычной библиотекой.
Предположим, что у нас есть библиотека с одним библиотекарем. В библиотеку приходит посетитель и просит достать ему первую часть Гарри Поттера. Библиотекарь идет к книжным полкам, находит книгу и приносит ее посетителю. Он, пролистав, отдает ее обратно библиотекарю, который относит и ставит книгу обратно на полку. Допустим, следом приходит еще один посетитель и просит то же самое. Цикл повторяется снова. Вот так же работает и система, у которой нет кэш-памяти.
Для чего процессору нужна кэш-память?
Теперь, давайте посмотрим, что произойдет, если у нас есть в наличие кэш-память. Представим, что наш библиотекарь сидит за столом, в котором есть ящик, который будет служить ему в качестве кэш – памяти. Процедура та же - первый посетитель дает заявку на книгу, но когда она возвращается библиотекарю, то он не относит ее на полку, а помещает в ящик, находящийся в столе. Когда придет другой посетитель и тоже закажет ту же самую книгу, то библиотекарю не надо будет за ней никуда идти, он просто возьмет ее из ящика. Аналогичным образом работает и кэш – память процессора. Каждый раз, когда запрашиваются новые данные, процессор ищет их сначала в кэш-памяти. Подобная мера позволяет многократно увеличить скорость работы процессора.
Кэш-память хранит только наиболее часто используемые элементы данных?
Нет, кэш-память является довольно интеллектуально продвинутой памятью, в которую помещаются также и те данные, которые, вероятно, будут востребованы в ближайшее время. Продолжая нашу аналогию с библиотекарем, это можно объяснить следующим образом. Когда посетитель просит библиотекаря достать ему первую часть Гарри Поттера, то наш догадливый библиотекарь также берет с полки и вторую часть Гарри Поттера, резонно полагая, что посетитель, прочитав первую часть, в скором времени попросит и вторую. И когда тот ее просит, то она тут же достается из того же ящика стола. Аналогичным образом, когда кэш-память извлекает элементы данных из основной памяти, она также выбирает данные, которые находятся по адресам, рядом с затребованными данными. Эти рядом расположенные блоки данных, которые передаются в кэш, называется строки кэша.
Два уровня кэш-памяти процессора
Большинство жестких дисков и некоторых других компонентов компьютера используют всего один уровень кэш – памяти. В отличие от них, кэш – память процессора является двухуровневой, в которой кэш 1-го уровня (L1) меньше и быстрее, а кэш 2-го уровня немного медленнее первого, но при этом намного быстрее, чем оперативная память. Кэш L1 разделен на две части, а именно, на кэш команд и на кэш данных. В кэше команд хранится набор инструкций, которые необходимы процессору для вычислений, в то время как кэш данных хранит значения, которые необходимы для текущего исполнения. Кэш L2 отвечает за загрузку данных из основной памяти. Опять же, возвращаясь к нашей библиотеке.
Рассмотрим, например, ящик библиотекаря как кэш L1. В один из сильно загруженных работой дней, когда посетителей много, спрос на книги велик, а ящик в столе заполнен, возникает риск его переполнения. В этом случае на помощь библиотекарю приходит рядом стоящий книжный шкаф (L2). В него библиотекарь будет складывать книги, когда не останется места в ящике стола. Теперь, когда у него спросят некоторые популярные книги, то он сначала посмотрит в ящик стола и если не найдет там запрашиваемой книги, то пойдет к книжному шкафу. Который, как вы, наверное, догадались, в нашей аналогии играет роль кэш-памяти второго уровня.
Аналогичным образом, в процессоре, когда кэш L1заполнен, данные сохраняются в кэш-память L2. Процессор в первую очередь ищет данные в первом кэше L1, и если они не будут найдены, то далее разыскиваются в L2. Если данные не будут найдены в L2, то следует запрос в оперативную память, и в последнюю очередь запрос делается к жесткому диску.
Чем больше кэш, тем лучше?
На этот вопрос можно ответить одновременно и, да и нет. Больший объем кэша позволяет быстро получать данные в случае, если они доступны в любом из уровней L1 и L2. Вернемся к нашему примеру с библиотекой. Если посетитель попросит какую – либо популярную книгу, которая не хранится библиотекарем в ящике стола или в книжном шкафу, то он сначала поищет ее в ящике, а затем перейдет к книжному шкафу. То есть некоторое количество времени будет тратиться впустую, прежде чем книга, наконец, будет извлечена с книжной полки библиотеки. Так же и процессор сначала проверяет кэш первого уровня (L1), затем второго (L2) и только после этого, отправляет запрос в оперативную память. Когда данные обнаруживаются в кэше, то это называется «попаданием», в противоположном случае – «промахом»
Таким образом, в процессе поиска данных в двух уровнях кэша, многопроцессорного времени фактически тратится зря. Элементы данных периодически обновляются и заменяются с использованием различных алгоритмов, чтобы максимизировать случаи попадания в кэш.
Многие сейчас, вероятно, сделали однозначный вывод, если кэш-память работает столь быстро, то почему бы не реализовать ее достаточно большой, с тем, чтобы все данные, с которыми работает оперативная память, хранить в кэше. Однако не все так просто, кэш память обеспечивает быстрый доступ к найденным, но при этом сам иерархический поиск данных влечет за собой большие ресурсные расходы. Поэтому наиболее предпочтительным вариантом является оптимальный баланс между скоростью поиска данных и размером кэш-памяти.
Как уже упоминалось ранее, статическая оперативная память нашла применение в кэш-памяти . Основное достоинство статической памяти - это ее быстродействие. Основной недостаток - большой физический объем, занимаемый памятью и высокое энергопотребление.
Напомним, что ячейка статической памяти построена на транзисторном каскаде, который может содержать до 10 транзисторов. Поскольку, время переключения транзистора из одного состояния в другое ничтожно мало, то и скорость работы статической памяти высока.
Кэш-память имеет небольшой объем и размещается непосредственно на процессорном кристалле. Ее скорость работы гораздо выше, чем у динамической памяти (модули ОЗУ), но ниже, чем работают регистры общего назначения (РОН) центрального процессора.
Впервые кэш-память появилась на 386-х компьютерах и располагалась она на материнской плате. Материнские платы 386 DX имели кэш-память объемом от 64 до 256 Кб. 486-е процессоры уже имели кэш-память, расположенную на процессорном кристалле, но кэш-память на материнской плате была сохранена. Система кэш-памяти стала двухуровневой: память на кристалле стали называть кэшем первого уровня (L1), а на материнской плате - кэшем второго уровня (L2). Со временем кэш второго уровня "перебрался" на кристалл процессора. Первой это осуществила AMD на процессоре K6-III (L1 = 64 Kb, L2 = 256 Kb).
Наличие кэшей двух уровней потребовало создания механизма их взаимодействия между собой. Существует два варианта обмена информацией между кэш-памятью первого и второго уровня, или, как говорят, две кэш-архитектуры: инклюзивная и эксклюзивная .
Инклюзивная кэш-память
Инклюзивная архитектура предполагает дублирование информации, находящейся в L1 и L2.
Схема работы следующая. Во время копирования информации из ОЗУ в кэш делается две копии, одна копия заносится в L2, другая копия - в L1. Когда L1 полностью заполнен, информация замещается по принципу удаления наиболее "старых данных" - LRU (Least-Recently Used). Аналогично происходит и с кэшем второго уровня, но, поскольку его объем больше, то и информация хранится в нем дольше.
При считывании процессором информации из кэша, она берется из L1. Если нужной информации в кэше первого уровня нет, то она ищется в L2. Если нужная информация в кэше второго уровня найдена, то она дублируется в L1 (по принципу LRU), а затем, передается в процессор. Если нужная информация не найдена и в кэше второго уровня, то она считывается из ОЗУ по схеме, описанной выше.
Инклюзивная архитектура применяется в тех системах, где разница в объемах кэшей первого и второго уровня велика. Например, у Pentium 3 (Coppermine): L1 = 16 Kb, L2 = 256 Kb; Pentium 4: L1 = 16 Kb, L2 = 1024 Kb. В таких системах дублируется небольшая часть кэша второго уровня, это вполне приемлемая цена за простоту реализации инклюзивного механизма.
Эксклюзивная кэш-память
Эксклюзивная кэш-память предполагает уникальность информации, находящейся в L1 и L2.
При считывании информации из ОЗУ в кэш - информация сразу заносится в L1. Когда L1 заполнен, то, по принципу LRU информация переносится из L1 в L2.
Если при считывании процессором информации из L1 нужная информация не найдена, то она ищется в L2. Если нужная информация найдена в L2, то по принципу LRU кэши первого и второго уровня обмениваются между собой строками (самая "старая" строка из L1 помещается в L2, а на ее место записывается нужная строка из L2). Если нужная информация не найдена и в L2, то обращение идет к ОЗУ по схеме, описанной выше.
Эксклюзивная архитектура применяется в системах, где разность между объемами кэшей первого и второго уровня относительно невелика. Например, у Athlon XP: L1 = 64 Kb, L2 = 256 Kb. В эксклюзивной архитектуре кэш-память используется более эффективно, но схема реализации эксклюзивного механизма гораздо сложнее.
Взаимодействие кэш-памяти с ОЗУ
Поскольку, кэш-память работает очень быстро, то в кэш помещается информация, к которой часто обращается процессор - это значительно ускоряет его работу. Информация из ОЗУ помещается в кэш, а потом к ней обращается процессор. Существует несколько схем взаимодействия кэш-памяти и основной оперативной памяти.
Кэш-память с прямым отображением. Самый простой вариант взаимодействия кэша с ОЗУ. Объем ОЗУ делится на сегменты (страницы), по объему равные объему всего кэша (например, при объеме кэша 64 Кб и ОЗУ разбивается на страницы по 64 Кб). При взаимодействии кэша с ОЗУ, одна страница ОЗУ размещается в кэш-памяти, начиная с нулевого адреса (т.е., с самого начала кэша). При повторной операции взаимодействия, следующая страница накладывается поверх существующей - т.е., фактически прежние данные заменяются на текущие.
Достоинства : простая организация массива, минимальное время поиска.
Недостатки : неэффективное использование всего объема кэш-памяти - ведь вовсе не обязательно, что данные будут занимать весь объем кэша, они могут занимать и 10%, но следующая порция данных уничтожает предыдущую, таким образом, фактически имеем кэш с гораздо меньшим объемом.
Наборно-ассоциативная кэш-память. Весь объем кэша делится на несколько равных сегментов, кратных двойке в целой степени (2, 4, 8). Например, кэш 64 Кб может быть разделен на:
- 2 сегмента по 32 Кб каждый;
- 4 сегмента по 16 Кб каждый;
- 8 сегментов по 8 Кб каждый.
Pentium 3 и 4 имеют 8-канальную структуру кэша (кэш разбит на 8 сегментов); Athlon Thunderbird - 16-канальную.
При такой организации, ОЗУ делится на страницы, равные по объему одному сегменту кэша (одному кэш-банку). Страница ОЗУ пишется в первый кэш-банк; следующая страница - во второй кэш-банк и т.д., пока все кэш-банки не будут заполнены. Дальнейшая запись информации идет в тот кэш-банк, который не использовался дольше всего (содержит самую "старую" информацию).
Достоинства : повышается эффективность использования всего объема кэша - чем больше кэш-банков (выше ассоциативность), тем выше эффективность.
Недостатки : более сложная схема управления работой кэша; дополнительное время на анализ информации.
Ассоциативная кэш-память. Это предельный случай предыдущего варианта, когда объем кэш-банка становится равным одной строке кэш-памяти (дальше делить уже некуда). При этом любая строка ОЗУ может быть сохранена в любом месте кэш-памяти.
Запоминающий кэш-массив состоит из строк равной длины. Емкость такой строки равна размеру пакета, считываемого из ОЗУ за 1 цикл (например, Pentium 3 - 32 байта; Pentium 4 - 64 байта). Строка загружается в кэш и извлекается только целиком.
Достоинства : максимальная эффективность использования пространства кэш-памяти.
Недостатки : наибольшие затраты времени на поиск информации.
Кэш[или кеш (англ. cache, от фр.
Размещено на реф.рф
cacher - прятать; произносится - кэш) - промежуточный буфер с быстрым доступом, содержащий информацию, которая с наибольшей вероятностью должна быть запрошена быстродействующей памятью, к примеру оперативной. Доступ к данным в кэше идёт быстрее, чем выборка исходных данных из медленной памяти (внешней) или их перевычисление, за счёт чего уменьшается среднее время доступа.
Впервые слово ʼʼкэшʼʼ в компьютерном контексте было использовано в 1967 году во время подготовки статьи для публикации в журнале ʼʼIBM Systems Journalʼʼ. Статья касалась усовершенствования памяти в разрабатываемой модели 85 из серии IBM System/360. Редактор журнала Лайл Джонсон попросил придумать более описательный термин, нежели ʼʼвысокоскоростной буферʼʼ, но из-за отсутствия идей сам предложил слово ʼʼкэшʼʼ. Статья была опубликована в начале 1968 года, авторы были премированы IBM, их работа получила распространение и впоследствии была улучшена, а слово ʼʼкэшʼʼ вскоре стало использоваться в компьютерной литературе как общепринятый термин.
Функционирование
Диаграмма кэша памяти ЦПУ
Кэш - это память с большей скоростью доступа, предназначенная для ускорения обращения к данным, содержащимся постоянно в памяти с меньшей скоростью доступа (далее ʼʼосновная памятьʼʼ). Кэширование применяется ЦПУ, жёсткими дисками, браузерами и веб-серверами.
Кэш состоит из набора записей. Каждая запись ассоциирована с элементом данных или блоком данных (небольшой части данных), которая является копией элемента данных в основной памяти. Каждая запись имеет идентификатор, определяющий соответствие между элементами данных в кэше и их копиями в основной памяти.
Когда клиент кэша (ЦПУ, веб-браузер, операционная система) обращается к данным, прежде всего исследуется кэш. В случае если в кэше найдена запись с идентификатором, совпадающим с идентификатором затребованного элемента данных, то используются элементы данных в кэше. Такой случай принято называть попаданием кэша. В случае если в кэше не найдено записей, содержащих затребованный элемент данных, то он читается из основной памяти в кэш, и становятся доступным для последующих обращений. Такой случай принято называть промахом кэша. Процент обращений к кэшу, когда в нём найден результат, принято называть уровнем попаданий или коэффициентом попаданий в кэш.
К примеру, веб-браузер проверяет локальный кэш на диске на наличие локальной копии веб-страницы, соответствующей запрошенному URL. В этом примере URL - это идентификатор, а содержимое веб-страницы - это элементы данных.
В случае если кэш ограничен в объёме, то при промахе должна быть принято решение отбросить некоторую запись для освобождения пространства. Для выбора отбрасываемой записи используются разные алгоритмы вытеснения.
При модификации элементов данных в кэше выполняется их обновление в основной памяти. Задержка во времени между модификацией данных в кэше и обновлением основной памяти управляется так называемой политикой записи.
В кэше с немедленной записью каждое изменение вызывает синхронное обновление данных в основной памяти.
В кэше с отложенной записью (или обратной записью) обновление происходит в случае вытеснения элемента данных, периодически или по запросу клиента. Для отслеживания модифицированных элементов данных записи кэша хранят признак модификации (изменённый или ʼʼгрязныйʼʼ). Промах в кэше с отложенной записью может потребовать два обращения к основной памяти: первое для записи заменяемых данных из кэша, второе для чтения крайне важно го элемента данных.
В случае, в случае если данные в основной памяти бывают изменены независимо от кэша, то запись кэша может стать неактуальной. Протоколы взаимодействия между кэшами, которые сохраняют согласованность данных, называют протоколами когерентности кэша.
[править]
Кэш центрального процессора
Ряд моделей центральных процессоров (ЦП) обладают собственным кэшем, для того чтобы минимизировать доступ к оперативной памяти (ОЗУ), которая медленнее, чем регистры. Кэш-память может давать значительный выигрыш в производительности, в случае когда тактовая частота ОЗУ значительно меньше тактовой частоты ЦП. Тактовая частота для кэш-памяти обычно ненамного меньше частоты ЦП.
См. также: Translation lookaside buffer.
Уровни кэша
Кэш центрального процессора разделён на несколько уровней. Для универсальных процессоров - до 3. Кэш-память уровня N+1 как правило больше по размеру и медленнее по скорости обращения и передаче данных, чем кэш-память уровня N.
Самой быстрой памятью является кэш первого уровня - L1-cache. По сути, она является неотъемлемой частью процессора, поскольку расположена на одном с ним кристалле и входит в состав функциональных блоков. Состоит из кэша команд и кэша данных. Некоторые процессоры без L1 кэша не могут функционировать. На других его можно отключить, но тогда значительно падает производительность процессора. L1 кэш работает на частоте процессора, и, в общем случае, обращение к нему может производиться каждый такт (зачастую является возможным выполнять даже несколько чтений/записей одновременно). Латентность доступа обычно равна 2−4 тактам ядра. Объём обычно невелик - не более 128 Кбайт.
Вторым по быстродействию является L2-cache - кэш второго уровня. Обычно он расположен либо на кристалле, как и L1, либо в непосредственной близости от ядра, к примеру, в процессорном картридже (только в слотовых процессорах). В старых процессорах - набор микросхем на системной плате. Объём L2 кэша от 128 Кбайт до 1−12 Мбайт. В современных многоядерных процессорах кэш второго уровня, находясь на том же кристалле, является памятью раздельного пользования - при общем объёме кэша в 8 Мбайт на каждое ядро приходится по 2 Мбайта. Обычно латентность L2 кэша, расположенного на кристалле ядра, составляет от 8 до 20 тактов ядра. В отличие от L1 кэша, его отключение может не повлиять на производительность системы. При этом, в задачах, связанных с многочисленными обращениями к ограниченной области памяти, к примеру, СУБД, производительность может упасть в десятки раз.
Кэш третьего уровня наименее быстродействующий и обычно расположен отдельно от ядра ЦП, но он должна быть очень внушительного размера - более 32 Мбайт. L3 кэш медленнее предыдущих кэшей, но всё равно значительно быстрее, чем оперативная память. В многопроцессорных системах находится в общем пользовании.
Кэш второго и третьего уровней наиболее полезен в математических задачах, к примеру, при обсчёте полигонов, когда объём данных меньше размера кэша. В этом случае, можно сразу записать все данные в кэш, а затем производить их обработку.
Ассоциативность кэша
Одна из фундаментальных характеристик кэш-памяти - уровень ассоциативности - отображает её логическую сегментацию. Дело в том, что последовательный перебор всех строк кэша в поисках необходимых данных потребовал бы десятков тактов и свёл бы на нет весь выигрыш от использования встроенной в ЦП памяти. По этой причине ячейки ОЗУ жёстко привязываются к строкам кэш-памяти (в каждой строке бывают данные из фиксированного набора адресов), что значительно сокращает время поиска. С каждой ячейкой ОЗУ должна быть связано более одной строки кэш-памяти: к примеру, n-канальная ассоциативность (англ. n-way set associative) обозначает, что информация по некоторому адресу оперативной памяти может храниться в n местах кэш-памяти.
При одинаковом объёме кэша схема с большей ассоциативностью будет наименее быстрой, но наиболее эффективной.
Кэширование внешних накопителей
Многие периферийные устройства хранения данных используют кэш для ускорения работы, в частности, жёсткие диски используют кэш-память от 1 до 64 Мбайт (модели с поддержкой NCQ/TCQ используют её для хранения и обработки запросов), устройства чтения CD/DVD/BD-дисков также кэшируют прочитанную информацию для ускорения повторного обращения. Операционная система также использует часть оперативной памяти в качестве кэша дисковых операций (в том числе для внешних устройств, не обладающих собственной кэш-памятью, в т.ч. жёстких дисков, flash-памяти и гибких дисков).
Применение кэширования внешних накопителей обусловлено следующими факторами:
скорость доступа процессора к оперативной памяти во много раз больше, чем к памяти внешних накопителей;
некоторые блоки памяти внешних накопителей используются несколькими процессами одновременно и имеет смысл прочитать блок один раз, затем хранить одну копию блока в оперативной памяти для всех процессов;
доступ к некоторым блокам оперативной памяти происходит гораздо чаще, чем к другим, в связи с этим использование кэширования для таких блоков в целом увеличивает производительность системы;
для некоторых блоков памяти внешних накопителей не требуется непосредственной записи после модификации, и использование кэша для таких блоков оптимизирует использование ввода-вывода.
Кэширование, выполняемое операционной системой
Кэш оперативной памяти состоит из следующих элементов:
набор страниц оперативной памяти, разделённых на буферы, равные по длине блоку данных соответствующего устройства внешней памяти;
набор заголовков буферов, описывающих состояние соответствующего буфера;
хеш-таблицы, содержащей соответствие номера блока заголовку;
списки свободных буферов.
Алгоритм работы кэша с отложенной записью
Изначально все заголовки буферов помещаются в список свободных буферов. В случае если процесс намеревается прочитать или модифицировать блок, то он выполняет следующий алгоритм:
пытается найти в хеш-таблице заголовок буфера с заданным номером;
в случае, в случае если полученный буфер занят, ждёт его освобождения;
в случае, в случае если буфер не найден в хеш-таблице, берёт первый буфер из хвоста списка свободных;
в случае, в случае если список свободных буферов пуст, то выполняется алгоритм вытеснения (см. ниже);
в случае, в случае если полученный буфер помечен как ʼʼгрязныйʼʼ, выполняет асинхронную запись содержимого буфера во внешнюю память.
удаляет буфер из хеш-таблицы, в случае если он был помещён в неё;
помещает буфер в хеш-таблицу с новым номером.
Процесс читает данные в полученный буфер и освобождает его. В случае модификации процесс перед освобождением помечает буфер как ʼʼгрязныйʼʼ. При освобождении буфер помещается в голову списка свободных буферов.
Таким образом:
если процесс прочитал некоторый блок в буфер, то велика вероятность, что другой процесс при чтении этого блока найдёт буфер в оперативной памяти;
запись данных во внешнюю память выполняется только тогда, когда не хватает ʼʼчистыхʼʼ буферов, либо по запросу.
Алгоритм вытеснения
В случае если список свободных буферов пуст, то выполняется алгоритм вытеснения буфера. Алгоритм вытеснения существенно влияет на производительность кэша. Существуют следующие алгоритмы:
LRU (Least Recently Used) - вытесняется буфер, неиспользованный дольше всех;
MRU (Most Recently Used) - вытесняется последний использованный буфер;
LFU (Least Frequently Used) - вытесняется буфер, использованный реже всех;
ARC (англ.) (Adaptive Replacement Cache) - алгоритм вытеснения, комбинирующий LRU и LFU, запатентованный IBM.
Применение того или иного алгоритма зависит от стратегии кэширования данных. LRU наиболее эффективен, в случае если данные гарантированно будут повторно использованы в ближайшее время. MRU наиболее эффективен, в случае если данные гарантированно не будут повторно использованы в ближайшее время. В случае, в случае если приложение явно указывает стратегию кэширования для некоторого набора данных, то кэш будет функционировать наиболее эффективно.
Программное кэширование
Политика записи при кэшировании
При чтении данных кэш-память даёт однозначный выигрыш в производительности. При записи данных выигрыш можно получить только ценой снижения надёжности. По этой причине в различных приложениях должна быть выбрана та или иная политика записи кэш-памяти..
Существуют две основные политики записи кэш-памяти - сквозная запись (write-through) и отложенная запись (write-back).
сквозная запись подразумевает, что при изменении содержимого ячейки памяти, запись происходит синхронно и в кэш и в основную память.
отложенная запись подразумевает, что можно отложить момент записи данных в основную память, а записать их только в кэш. При этом данные будут выгружены в оперативную память только в случае обращения к ним какого либо другого устройства (другой ЦП, контроллер DMA) либо нехватки места в кэше для размещения других данных. Производительность, по сравнению со сквозной записью, повышается, но это может поставить под угрозу целостность данных в основной памяти, поскольку программный или аппаратный сбой может привести к тому, что данные так и не будут переписаны из кэша в основную память. Вместе с тем, в случае кэширования оперативной памяти, когда используются два и более процессоров, нужно обеспечивать согласованность данных в разных кэшах.
Кэширование интернет-страниц
В процессе передачи информации по сети может использоваться кэширование интернет-страниц - процесс сохранения часто запрашиваемых документов на (промежуточных) прокси-серверах или машине пользователя, с целью предотвращения их постоянной загрузки с сервера-источника и уменьшения трафика. Τᴀᴋᴎᴍ ᴏϬᴩᴀᴈᴏᴍ, информация перемещается ближе к пользователю. Управление кэшированием осуществляется при помощи HTTP-заголовков.
Как вариант, кэширование веб-страниц может осуществляться с помощью CMS конкретного сайта для снижения нагрузки на сервер при большой посещаемости. Кэширование может производится как в память, так и в файловый кэш (кэш на файлах).
Кэширование результатов работы
Многие программы записывают куда-либо промежуточные или вспомогательные результаты работы, чтобы не вычислять их каждый раз, когда они понужнобятся. Это ускоряет работу, но требует дополнительной памяти (оперативной или дисковой). Примером такого кэширования является индексирование баз данных.