Кэш-память процессора. уровни и принципы функционирования

Посмотреть процессор изнутри

Поможет в этом программа CPU-Z. Скачать её можно с сайта разработчиков, вот по этой ссылке. Или тут. Она на английском, но это не проблема, т.к. там всё ясно как день. Хотя кое что я всё же поясню.

Итак, после установки и запуска видим вот такое окошко.

На первой вкладке CPU, отображается вся техническая информация о центральном процессоре. А именно:

  • Производитель и модель изделия
  • Очень полезный параметр — Soket. Это разъём под процессор. Именно он покажет до какого уровня можно модернизировать проц.
  • Кеш память (Cache) — это внутренняя память процессора
  • Количество ядер (Cores)

Единственный параметр, который я не нашёл тут — это частота процессора в МГЦ. Частоту можно посмотреть при помощи программы Speccy, она тоже отображает достаточно подробную информацию, но всё же анализ двумя утилитами лишним не будет.

Вкладка Caches. Более подробная информация о кеше.

Вкладка Maindord. Всё о материнской плате.

Назначение кэш памяти

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

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

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

Выполняет примерно ту же функцию, что и оперативная память . Только кэш — это память встроенная в процессор . Кэш-память используется процессором для хранения информации. В ней буферизируются самые часто используемые данные, за счет чего, время очередного обращения к ним значительно сокращается. Если емкость оперативной памяти на новых компьютерах от 1 Гб, то кэш у них около 2-8 Мб. Как видите, разница в объеме памяти ощутимая. Но даже этого объема вполне хватает, чтобы обеспечить нормальное быстродействие всей системы. Сейчас распространены процессоры с двумя уровнями кэш-памяти: L1 (первый уровень) и L2 (второй). Кэш первого уровня намного меньше кэша второго уровня, он обычно около 128 Кб. Используется он для хранения инструкций. А вот второй уровень используется для хранения данных, поэтому он больше. Кэш второго уровня сейчас у большинства процессоров общий. Но не у всех, вот например у AMD Athlon 64 X 2 у каждого ядра по своему кэшу L2. Кампания AMD обещает в скором времени предоставить процессор AMD Phenom с четырьмя ядрами и тремя уровнями кэш-памяти.

Программный кэш

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

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

Различают кэш память 1-, 2- и 3-го уровней (маркируются L1, L2
и L3
).

Кэш память первого уровня (L1)
— самый быстрый, но по объему меньший, чем у остальных. С ним напрямую работает ядро процессора. Кэш память 1-го уровня имеет наименьшую латентность (время доступа).Кэш память второго уровня (L2)
– объем этой памяти значительно больше, чем кэш память первого уровня.Кэш память третьего уровня (L3)
– кэш память с большим объемом и более медленный чем L2.

В классическом варианте существовало 2 уровня кэш-памяти – 1-ий и второй уровень. 3-ий уровень по организации отличается от кэш памяти 2-ого уровня. Если данные не обрабатывались или процессор должен обработать срочные данные, то для освобождения кэш память 2-ого уровня данные перемещаются в кэш память 3-го уровня. Кэш память L3 больше по размеру, однако, и медленнее, чем L2 (шина между L2 и L3 более узкая, чем шина между L1 и L2), но все же его скорость, намного выше скорость системной памяти.

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

В кэш память 2-ого уровня из данных строятся цепочка инструкций, а в кэше 1-ого уровня «зеркально» строятся внутренние команды процессора, которые учитывают особенности процессора, регистры и т.д. Число внутренних команд центрального процессора не слишком много поэтому величина кэша 1-ого уровня не имеет большого значения (в современных процессорах кэш память 1-ого уровня L1 может быть с 64 Кб, 128Кб на каждое из ядер). В отличии от кэш памяти 1-ого уровня, кэш память 2-ого уровня для процессора имеет огромное значение, именно поэтому процессоры с наибольшим объемом кэша 2-ого уровня показывают высокую производительность.

В организации структуры Кэш памяти для процессоров существуют отличия. К примеру, AMD процессоры четко разделёны между ядрами кэш памяти, и маркируются соответственно — 512х2 (Athlon 5200
и ниже) или 1024х2 (у Athlon 5200
и выше). А у процессоров Intel Core2Duo
кэш строго не поделён, а значит для каждого из ядер можно использовать необходимое количество памяти общего кэша, это хорошо подходит для систем, не поддерживающих многоядерность. Если использовать все ядра, кэш память разделяется на каждое из ядер динамически, в зависимости от нагрузки каждого из ядер.

Структура кэша

Система кэш-памяти процессора состоит из двух блоков — контроллера кэш-памяти и собственно самой кэш-памяти. Она представлена на рисунке 1.


Рис.1. Структура и функционирование кэша

Кэш память

Это место, где хранится содержание кэша. Кэш-память процессора изготавливают в виде микросхем статической памяти (Static Random Access Memory, сокращенно — SRAM). По сравнению с другими типами памяти, статическая память обладает очень высокой скоростью работы. Однако, эта скорость зависит также от объема конкретной микросхемы. Чем значительней объем микросхемы, тем сложнее обеспечить высокую скорость ее работы. Если такая особенность учтена производителем, то кэш-память процессора содержит несколько блоков, называемых уровнями. В большинстве процессоров используется трехуровневая система кэша:

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

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

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

Контроллер кэш памяти

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

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

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

Зачем нужна кэш память

В компьютере используется несколько типов памяти. Всем известны HDD/SSD для долгосрочного хранения информации и ОЗУ (RAM), которая при потере питания сбрасывает всё содержимое

Важное различие между ними — это скорость доступа к данным

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

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

Защищённый режим

Во времена DOS-систем процессоры работали в «реальном режиме», где используется сегментная адресация памяти, при которой любому процессу доступна вся память компьютера, и он может выполнить любую допустимую инструкцию процессора. Когда процесс работает в среде ОС монопольно, это очень выгодно с точки зрения производительности, но появляются проблемы при нескольких работающих одновременно процессах. Для того, чтобы один процесс не смог случайно или специально несогласованно использовать память другого процесса или исполнить привилегированную инструкцию, которая может повлиять на работу ОС и других процессов, и был придуман «Защищённый режим».

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

За исключением некоторых тонкостей, ненужных в этой статье, для переключения в защищённый режим x86_64 (есть ещё классический защищённый режим x86) необходимо установить биты PE (Разрешение защиты, бит 0) и PG (Страничный режим, бит 31), включающий MMU, в регистре CR0, а также указатель на таблицу PML4 в регистре CR3 (c 13 по 63 бит). Именно в таблице PML4 и хранится информация об адресах, правах доступа и прочем.

Meltdown

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

Ещё немного о PML4

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

  • P (Present) указывает на то, что далее идёт таблица следующего уровня. Если 0, то вместо указателя на следующую таблицу лежит указатель на физическую страницу без смещения. Если в PT будет лежать сразу указатель на физический сегмент, то такой сегмент будет размером 2 МБ. C 1 ГБ сегментами аналогично, только в PD-таблице.
  • R/W (Read/Write) указывает на доступ для чтения. Если стоит 0, то разрешено только чтение.
  • NX (No Execute) (самый левый), установленный в 1, запрещает исполнение данных как программный код.
  • U/S (User/Supervisor), установленный в 0, запрещает использовать данные процессам (User, кольцо защиты 3), память может быть использована только ОС и драйверами (Supervisor, кольцо 0) (это по сути самый важный флаг для Meltdown).
  • A (Accessed) указывает на то, была ли память, на которую указывает таблица, использована хотя бы раз.

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

Наконец, перейдём к самому принципу работы уязвимости Metldown.

Ранее уже было написано о спекулятивном исполнении команд в статье об архитектуре процессора. Цитата из статьи: «Спекулятивное исполнение команд — это выполнение команды до того, как станет известно, понадобится эта команда или нет».

Суть атаки в том, что современные ОС всё своё адресное пространство отображают в адресном пространстве каждого пользователя (процесса). Другими словами добавляют в PML4-таблицу процесса указатели на подтаблицы ОС, но с флагом U/S, установленным в 0. Это сделано для того, чтобы при переключении контекста процесса уменьшить количество операций перезаписи CR3 и улучшить кэширование данных ОС с чистыми VIPT- или VIVP-кэшами (PML4 первого процесса → PML4 второго процесса вместо PML4 первого процесса → PML4 ОС → PML4 второго процесса), но эту защиту можно обойти в некоторых процессорах Intel и ARM (у AMD обнаружили только уязвимость Spectre, у которой другой принцип работы).

Некоторые ОС используют одну PML4-таблицу на всю систему, а при переключении контекста меняют только подтаблицы. Отсюда в той же Windows максимальный размер ОЗУ 256 ГБ — максимальный размер таблицы PDP.

При спекулятивном исполнении в уязвимых процессорах часть команд может выполниться до того, как будет проверено, стоит ли бит 0 в U/S флаге. Причём благодаря спекуляции код атаки может быть выполнен из недостижимого кода, например, в ветке else при всегда истинном условии в if, перед тем, как процессору станет известно, что этот код недостижим. После того, как процессор поймёт, что доступа к этой памяти нет, он обнулит результат команд доступа к памяти, сбросив соответствующие регистры, но TLB- и L1-кэш он сбрасывать не будет. А в них уже не хранится флаг U/S, поэтому процесс может получить полный доступ к успевшей закэшироваться закрытой памяти ядра ОС, ведь процессор, который нашёл нужную запись в L1 и TLB, не будет проверять её в PML4. Решается эта проблема либо аппаратно — добавлением флагов из PML4 в TLB, либо программно — удаление таблиц памяти ОС из PML4-процессов, что увеличит время смены контекста и системных вызовов.

Для чего нужен кэш, и насколько целесообразно его увеличение?

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

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

Функционирование

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

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

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

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

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

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

При модификации элементов данных в кэше выполняется их обновление в основной памяти. Задержка во времени между модификацией данных в кэше и обновлением основной памяти управляется так называемой .

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

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

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

Подводя итоги

В ситуации, когда процессорные ядра достигли частотного порога насыщения, а их количество напрямую не может оп­ре­де­лять производительность всего вычислительного комплекса, решающее значение имеет ос­на­ще­ние CPU ум­ны­ми ал­го­рит­ма­ми, где не последнее место отводится алгоритмам кэширования. В про­цес­со­рах семейства AMD Rome кроме приватных кэш-ресурсов L1 и L2 на первых ролях агрегирований L3-кэш. Его задача — обес­пе­чить про­из­во­ди­тель­ность CCX-кластера в частности и всего процессора в целом, а так­же снизить нагрузку на подсистему DRAM, об­слу­жи­ва­е­мую от­дель­ным крис­тал­лом I/O Hub.

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

В основе обнаруженного феномена — зависимость от объема и организации буфера ассоциативной трансляции. Не­труд­но за­ме­тить, что ситуация, при которой данные обрабатываемого блока помещаются в кэш-памяти, а кар­ти­ру­ю­щий контекст, необходимый для трансляции его страниц не помещается в TLB (в режиме 4K стра­ниц), характерна для блоков, объем которых сравним с объемом L3

В этой ситуации роль TLB ста­но­вит­ся критически важной. Про­тес­ти­ро­ван­ный про­цес­сор AMD EPYC 7452 32-Core доказал это

Как следует из графиков латентности, в режиме Large Pages имеет место полуторакратное снижение ве­ли­чи­ны за­дер­жки при доступе к L3 при объеме блока X=16MB. Этот факт заслуживает внимания разработчиков коммерческого про­грам­мно­го обес­пе­че­ния, от­вет­ст­вен­но относящихся к оптимизации кода — сценарий нашего синтетического теста мо­де­ли­ру­ет доступ к фраг­мен­ти­ро­ван­ным данным. Несмотря на все сложности внедрения «больших страниц», их ис­поль­зо­ва­ние в при­клад­ных за­да­чах (сис­те­мы уп­рав­ле­ния ба­за­ми дан­ных и т.п.) вы­гля­дит оп­рав­да­но с точ­ки зре­ния борь­бы за каж­дую на­но­се­кун­ду про­цес­сор­но­го вре­ме­ни.

Оцените статью
Рейтинг автора
5
Материал подготовил
Андрей Измаилов
Наш эксперт
Написано статей
116
Добавить комментарий