Что такое кэш память

Кэш — Википедия

Кэш[1][2][3][4] или кеш[5][6][7] (англ. cache, от фр. cacher — «прятать»; произносится [kæʃ] — «кэш») — промежуточный буфер с быстрым доступом, содержащий информацию, которая может быть запрошена с наибольшей вероятностью. Доступ к данным в кэше осуществляется быстрее, чем выборка исходных данных из более медленной памяти или удаленного источника, однако её объём существенно ограничен по сравнению с хранилищем исходных данных.

Впервые слово «cache» в компьютерном контексте было использовано в 1967 году во время подготовки статьи для публикации в журнале «IBM Systems Journal». Статья касалась усовершенствования памяти в разрабатываемой модели 85 из серии IBM System/360. Редактор журнала Лайл Джонсон попросил придумать более описательный термин, нежели «высокоскоростной буфер», но из-за отсутствия идей сам предложил слово «cache». Статья была опубликована в начале 1968 года, авторы были премированы IBM, их работа получила распространение и впоследствии была улучшена, а слово «кэш» вскоре стало использоваться в компьютерной литературе как общепринятый термин[8].


Отображение кэша памяти ЦПУ в основной памяти.

Кэш — это память с большей скоростью доступа, предназначенная для ускорения обращения к данным, содержащимся постоянно в памяти с меньшей скоростью доступа (далее «основная память»). Кэширование применяется ЦПУ, жёсткими дисками, браузерами, веб-серверами, службами DNS и WINS.

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

Проще всего ответить на вопрос, зачем нужна кэш­память. Как известно, процессор работает с данными, хранящимися в оперативной памяти. Однако скорость работы оперативной памяти и процессора существенно различаются: если бы процессор напрямую общался с оперативной памятью (читал или записывал данные), то большую часть времени попросту простаивал бы. Именно для сокращения задержек доступа к оперативной памяти и применяется кэш­память, которая значительно более скоростная в сравнении с оперативной. Фактически если оперативная память используется для того, чтобы сгладить задержки доступа к данным на накопителе (HDD-диске, SSD-накопителе или флэш­памяти), то кэш­память процессора применяется для нивелирования задержек доступа к самой оперативной памяти. В этом смысле оперативную память можно рассматривать как кэш накопителя. Однако между оперативной памятью и кэшем процессора есть одно очень серьезное различие: кэш процессора полностью прозрачен для программиста, то есть нельзя адресовать программным образом находящиеся в нем данные.

Понятно, что для того, чтобы кэш процессора мог выполнять свою основную задачу, то есть сглаживать доступ к оперативной памяти, он должен работать гораздо быстрее, чем она. Так, если оперативная память представляет собой динамическую память с произвольным доступом (Dynamic Random Access Memory, DRAM), то кэш процессора выполняется на базе статической оперативной памяти (Static Random Access Memory, SRAM).

Статическая память SRAM без проблем работает на частотах в несколько гигагерц, то есть кэш на основе такой памяти может работать на тактовой частоте процессора. Динамическая память DRAM функционирует на частотах существенно более низких. К примеру, эффективная частота наиболее распространенной сегодня DRAM-памяти DDR3 составляет 1600 МГц. Однако это именно эффективная частота памяти, то есть частота, с которой данные поступают на внешнюю шину в пакетном режиме доступа, а реальная частота ядра памяти составляет всего 200 МГц. Конечно же, нас интересует в первую очередь именно эффективная частота памяти, то есть 1600 МГц, или 1,6 ГГц. Казалось бы, это немало, но нужно учитывать и тайминги памяти, которые характеризуют ее латентность. Причем тайминги памяти определяются в тактах работы ядра памяти, а не в тактах эффективной частоты, то есть для памяти DDR3-1600 c частотой работы ядра памяти 200 МГц каждый такт составляет 1/200 МГц = 5 нс. В то же время такт процессора с частотой, к примеру, 3 ГГц длится всего 0,3 нс, то есть в 17 раз меньше.

Напомним, что тайминги памяти — это задержки, измеряемые в тактах работы ядра памяти, между отдельными командами. Выделяют несколько таймингов памяти, соответствующих задержкам между различными командами. Наиболее важными являются тайминги RAS-to-CAS Delay (tRCD), CAS Latency (tCL), Active-to-precharge delay (tRAS) и RAS Precharge (tRP).

Тайминг tRCD определяет задержку командой активации (ACTIVE) нужной строки памяти и командой записи (WRITE) или чтения (READ) данных.

От команды чтения (записи) данных и до выдачи первого элемента данных на шину (записи данных в ячейку памяти) проходит промежуток времени tCL. Каждый последующий элемент данных появляется на шине данных в очередном такте (при пакетном доступе).

Завершение цикла обращения к банку памяти осуществляется подачей команды PRECHARGE, приводящей к закрытию строки памяти. От команды PRECHARGE и до поступления новой команды активации строки памяти должен пройти промежуток времени tRP.

А минимальный промежуток времени, длящийся с момента подачи команды активации строки до команды PRECHARGE, которая приводит к закрытию строки памяти, называется tRAS. Основные тайминги памяти обычно записываются в виде такой последовательности: tCL-tRCD-tRP-tRAS.

Теперь рассмотрим в качестве примера память DDR3-1600 c таймингами 9-9-9-27. Предположим, что процессор напрямую обращается к данным оперативной памяти, которые нужно загрузить в его регистры для дальнейшей обработки. С момента активации нужной строки памяти и до появления данных на шине пройдет промежуток времени, равный tRCD+tCL, то есть 18 тактов. С учетом того что частота работы ядра памяти DDR3-1600 составляет 200 МГц, это время равно 90 нс. Если частота работы процессора составляет 3 ГГц, то это означает, что процессор должен будет дожидаться нужных данных (по сути простаивать) минимум 270 тактов! Понятно, что если бы современные процессоры общались с оперативной памятью напрямую, то есть без кэша, то были бы крайне медлительны и в их гигагерцах не было бы никакого смысла.

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

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

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

SRAM-память на самом деле более быстродействующая в сравнении с DRAM-памятью, однако если каждая ячейка DRAM-памяти состоит из одного полевого транзистора и одного конденсатора, то ячейка SRAM-памяти — как минимум из шести полевых транзисторов (есть варианты с числом транзисторов 8 и 12). Понятно, что при таком количестве транзисторов на одну ячейку микросхема SRAM-памяти просто не может иметь такой же объем, как микросхема DRAM-памяти. То есть модули SRAM-памяти, во-первых, были бы меньшего объема в сравнении с модулями DRAM-памяти, а во-вторых, стоили бы дороже.

Но и это еще не всё. Даже если создать оперативную память, которая по скорости не будет уступать кэшу на основе SRAM-памяти, то это не избавит от необходимости использования кэша в силу того, что считываемые из памяти (или записываемые в память) блоки данных нужно где­то временно размещать.

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

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

Ниже мы поэтапно рассмотрим метод очистки таких браузеров, как Internet Explorer, Opera и Firefox.

Как очистить кэш браузера?

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

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

Ри­су­нок 3. При­мер по­ис­ка эле­мен­та в кэ­ше по его ад­ре­су.
Дан­ные при­ве­де­ны в ше­ст­на­дца­те­рич­ном ви­де

Ко­гда про­цес­сор хо­чет про­честь дан­ные по ка­ко­му-ли­бо ад­ре­су опе­ра­тив­ной па­мя­ти, он пе­ре­да­ёт этот ад­рес в кон­т­рол­лер кэш-па­мя­ти. Кэш осу­ществ­ля­ет од­но­вре­мен­ное срав­не­ние всех имею­щих­ся у не­го те­гов с пе­ре­дан­ным ад­ре­сом. Ес­ли ад­рес най­ден, то кэш вы­да­ёт тре­буе­мый байт дан­ных (ри­су­нок 3). Ес­ли же дан­ные не най­де­ны (про­мах кэ­ша), то про­из­во­дит­ся об­ра­ще­ние к опе­ра­тив­ной па­мя­ти.

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

списки свободных буферов.

Алгоритм работы кэша с отложенной записью

Изначально все заголовки буферов помещаются в список свободных буферов. Если процесс намеревается прочитать или модифицировать блок, то он выполняет следующий алгоритм:

пытается найти в хеш-таблице заголовок буфера с заданным номером;

в случае, если полученный буфер занят, ждёт его освобождения;

в случае, если буфер не найден в хеш-таблице, берёт первый буфер из хвоста списка свободных;

в случае, если список свободных буферов пуст, то выполняется алгоритм вытеснения (см. ниже);

Современные процессоры, оснащены кэшем, который состоит, зачастую из 2–ух или 3-ёх уровней. Конечно же, бывают и исключения, но зачастую это именно так.

В общем, могут быть такие уровни: L1 (первый уровень), L2 (второй уровень), L3 (третий уровень). Теперь немного подробнее по каждому из них:


Таким образом, выделение и замещение
строк
выполнятся только кэш-промахов
чтения, при промахах записи заполнение
строк не производится. Если затребованная
область памяти присутствует в строке
внутреннего кэша, то он обслужит этот
запрос. Управлять кэшированием можно
только на этапе заполнения строк; кроме
того, существует возможность их
аннулирования – объявления недостоверными
и очистка всей кэш-памяти.

Очистка внутренней кэш-памяти при
сквозной записи (обнуление бит
достоверности всех строк) осуществляется
внешним сигналом FLUSH#
за один такт системной шины (и, конечно
же, по сигналу RESET). Кроме
того, имеются инструкции аннулирования
INVD и WBINVD.
Инструкция INVDаннулирует строки внутреннего
кэша без выгрузки модифицированных
строк, поэтому ее неосторожное
использование при включенной политике
обратной записи может привести к
нарушению целостности данных в
иерархической памяти. Инструкция WBINVD
предварительно выгружает
модифицированные строки в основную
память (при сквозной записи ее действие
совпадает с INVD).
При обратной записи очистка кэша
подразумевает и выгрузку всех
модифицированных строк в основную
память. Для этого, естественно, может
потребоваться и значительное число
тактов системной шины, необходимых для
проведения всех операций записи.

Аннулирование строк выполняется
внешними схемами – оно необходимо в
системах, у которых в оперативную память
запись может производить не только один
процессор, а и другие контроллеры шины
– процессор или периферийные контроллеры.
В этом случае требуются специальные
средства для поддержания согласованности
данных во всех ступенях памяти – в
первичной и вторичной кэш-памяти и
динамического ОЗУ. Если внешний (по
отношению к рассматриваемому процессору)
контроллер выполняет запись в память,
процессору должен быть подан сигнал
AHOLD. По этому сигналу
процессор немедленно отдает управление
шиной адреса A[31:4],
на которой внешним контроллером
устанавливается адрес памяти,
сопровождаемый стробом EADS#.
Если адресованная память присутствует
в первичном кэше, процессор аннулирует
строку – сбрасывает бит достоверности
этой строки (она освобождается).
Аннулирование строки процессор выполняет
в любом состоянии.


Смешанная и разделенная кэш-память.

44 180 КБ \Need for Speed Most Wanted\SOUND\ENGINE

31 7 МБ \System Volume Information\RP32\A0020244.exe

29 120 КБ \age of mythology\Eng\history\units

29 120 КБ \age of mythology\locale\history\units

28 116 КБ \age of mythology\Eng\history\techs

28 116 КБ \age of mythology\locale\history\techs

25 108 КБ \Need for Speed Most Wanted\TRACKS\L2RA

11 44 КБ \2\Katjuha 2005

10 625 КБ \System Volume Information\RP32\A0020265.exe

10 69 КБ \Thumbs.db

9 548 КБ \System Volume Information\RP32\A0020243.exe

9 40 КБ \Need for Speed Most Wanted\NIS

8 36 КБ \Need for Speed Most Wanted\European Help Files\Sv

8 36 КБ \Need for Speed Most Wanted\European Help Files\pt-br

8 36 КБ \Need for Speed Most Wanted\European Help Files\pt

8 36 КБ \Need for Speed Most Wanted\European Help Files\NL

8 126 КБ \System Volume Information\RP34\change.log.2

8 36 КБ \Need for Speed Most Wanted\European Help Files\Da

8 36 КБ \Need for Speed Most Wanted\European Help Files\en-uk

8 36 КБ \Need for Speed Most Wanted\European Help Files\De

8 36 КБ \Need for Speed Most Wanted\European Help Files\fr-fr

8 36 КБ \Need for Speed Most Wanted\European Help Files\Fi

8 36 КБ \Need for Speed Most Wanted\European Help Files\es

7 32 КБ \Need for Speed Most Wanted\EA Help

7 28 КБ \Need for Speed Most Wanted\CARS

7 60 КБ \2\@1@

6 372 КБ \System Volume Information\RP32\A0020250.dll

6 336 КБ \System Volume Information\RP32\A0020247.exe

6 64 КБ \2\@@@@

5 316 КБ \System Volume Information\RP32\A0020241.exe

Том (E:) после дефрагментации:

Размер тома = 30,58 ГБ

Размер кластера = 4 КБ

Занято = 21,23 ГБ


В неэксклюзивной кэши могут вести себя как угодно.

Наверх