Уровни кэша
Кэш центрального процессора разделён на несколько уровней. В универсальном процессорев настоящее время число уровней может достигать 3. Кэш-память уровня N+1 как правило больше по размеру и медленнее по скорости доступа и передаче данных, чем кэш-память уровня N.
Самой быстрой памятью является кэш первого уровня — L1-cache. По сути, она является неотъемлемой частью процессора, поскольку расположена на одном с ним кристалле и входит в состав функциональных блоков. В современных процессорах обычно кэш L1 разделен на два кэша, кэш команд (инструкций) и кэш данных (Гарвардская архитектура). Большинство процессоров без L1 кэша не могут функционировать. L1 кэш работает на частоте процессора, и, в общем случае, обращение к нему может производиться каждыйтакт. Зачастую является возможным выполнять несколько операций чтения/записи одновременно.Латентностьдоступа обычно равна 2−4 тактам ядра. Объём обычно невелик — не более 128 Кбайт.
Вторым по быстродействию является L2-cache — кэш второго уровня, обычно он расположен на кристалле, как и L1. В старых процессорах — набор микросхем на системной плате. Объём L2 кэша от 128 Кбайт до 1−12 Мбайт. В современных многоядерных процессорах кэш второго уровня, находясь на том же кристалле, является памятью раздельного пользования — при общем объёме кэша в n*M Мбайт на каждое ядро приходится по n*M/nс Мбайта, где nс количество ядер процессора. Обычно латентность L2 кэша, расположенного на кристалле ядра, составляет от 8 до 20 тактов ядра.
Кэш третьего уровня наименее быстродействующий, но он может быть очень внушительного размера — более 24 Мбайт. L3 кэш медленнее предыдущих кэшей, но всё равно значительно быстрее, чем оперативная память. В многопроцессорных системах находится в общем пользовании и предназначен для синхронизации данных различных L2.
Иногда существует и 4 уровень кэша, обыкновенно он расположен в отдельной микросхеме. Применение кэша 4 уровня оправдано только для высоко производительных серверовимейнфреймов.
Есть три (в серверах иногда четыре) уровня cache: первый — L1, второй — L2, третий — L3. К L1 доступ будет быстрей, чем ко L2 и к L3, а ко второму быстрей чем к L3, но все же время доступа к третьему в несколько раз больше, чем к информации в ОЗУ.
Объем первого кэша L1до 128 Кб,
второго L2 от 128 Кб до 1-12 Мб,
третьего L3 свыше 24 Мб.
Проблема синхронизации между различными кэшами (как одного, так и множества процессоров) решается когерентностью кэша.
Существует три варианта обмена информацией между кэш-памятью различных уровней, или, как говорят, кэш-архитектуры: инклюзивная, эксклюзивная и неэксклюзивная:
- инклюзивный — предполагает дублирование информации кэша верхнего уровня в нижнем (предпочитает фирма Intel);
- эксклюзивный — предполагает уникальность информации, находящейся в различных уровнях кэша (предпочитает фирмаAMD);
- неэксклюзивный — уровни кэша связываются между собой как угодно.
1.2. Размещение информации в основной памяти ibm pc
Адресуемой единицей информации основной памяти IBM PC является байт. Это означает, что каждый байт, записанный в ОП, имеет уникальный номер (адрес). Рассмотрим структуру ОП при 20-битной ША: При использовании 20-битной шины адреса абсолютный (физический) адрес каждого байта является пятиразрядным шестнадцатеричным числом, принимающим значения от 00000 до FFFFF. В младших адресах располагаются блоки операционной системы (векторы прерываний, зарезервированная область памяти BIOS), в этой же части могут размещаться драйверы устройств, дополнительные обработчики прерываний DOS и BIOS, командный процессор операционной системы. Затем располагается область памяти, отведенная пользователю. Область памяти пользователя заканчивается адресом 9FFFF. Этот адрес является физической границей оперативного ЗУ, последним адресом 640-Кбайтной основной памяти. Остальное адресное пространство (128 Кбайт с адреса А0000 по BFFFF) отведено под видеопамять, которая физически размещается не в ОП, а в адаптере дисплея. После видеопамяти расположено адресное пространство (256Кбайт) ПЗУ, хранящего программы базовой системы ввода-вывода (BIOS — “Basic Input — Output System”). Эта часть ОП еще называется ROM-BIOS. Из отведенных 256 Кбайт непосредственно ПЗУ занимает 64 Кбайта, а остальные 192 Кбайт оставлены для расширения ПЗУ. Поскольку большая часть оставленной для расширения BIOS части адресного пространства не используется, в этих адресах часто располагается информация, необходимая для работы сетевых карт, графических расширителей и др. Запись в ОП (и чтение из нее) может осуществляться не только байтами, но и машинными словами. При этом машинное слово при размещении в памяти занимает несколько смежных байтов. Каждый байт ОП имеет свой адрес. Но машинное слово характеризуется не всеми адресами занятых байтов, а только одним — адресом младшего байта слова. Обычно графически машинное слово изображается так, что младший байт находится справа (рис.3).
Рис.3.Стереотипное представление машинного слова При записи слова младший байт размещается по адресу, который является адресом машинного слова, старший байт машинного слова размещается в следующем по порядку байте ОП, имеющем номер, увеличенный на 1 (здесь действует мнемоническое правило “младший байт — по младшему адресу”).
Рис. 4.“Вращение” байтов при чтении машинного слова из ОП При чтении из ОП двух следующих подряд байтов машинного слова их принято размещать слева направо: сначала первый из прочитанных байтов (с меньшим адресом), а затем — следующий. В результате происходит “вращение” байтов (рис.4), которое психологически трудно воспринимается. Необходимо помнить что: при записи отдельных байтовкаждый байт располагается в ОП по своему адресу, при чтении никакого вращения не происходит; при записи же в ОП единиц информации, имеющих в своем составе больше одного байта, адресом информационной единицы является адрес самого младшего байта, запись в ОП ведется побайтно, начиная с самого младшего байта, каждый последующий байт располагается в ячейке, адрес которой на 1 больше предыдущего. Иными словами, запись машинного или двойного слова производится справа налево, тогда как при чтении считанные байты обычно располагаются слева направо — происходят “вращение” байтов, перестановка их местами, что необходимо учитывать при работе с ОП на физическом уровне.
4.2.1. Использование кэш-памяти
Собственно концепция многоуровневой памяти обсуждалась в главе 1, где и был приведен пример подсчета среднего времени обращения к памяти, состоящей из двух ступеней (кэш-памяти и оперативной памяти). И хотя задачи управления иерархией памяти для разных уровней одинаковы по содержанию, реализация их различна, в первую очередь, из-за отличий в быстродействии и информационных емкостях разных уровней. Кэш-память находится на верхних уровнях иерархии памяти, играет роль своего рода буфера между процессором и оперативной памятью, обеспечивая ускорение доступа к последней. Как отмечалось ранее, кэш может иметь несколько уровней: уровень L1 или внутренний, уровень L2, ранее называемый внешним, но уже давно переместившийся внутрь процессора. В больших системах встречается и кэш третьего уровня. В связи с высокими скоростями работы перечисленных устройств управление кэш-памятью должно обеспечить решение ряда задач, связанных:
— с быстрым определением местоположения требуемой информации в двухуровневом фрагменте (кэш L1–кэш L2 или кэш L2 – оперативная память) системы памяти; — выбором информации, которую можно удалить из верхнего уровня при необходимости занесения в него новой информации и отсутствии в нем свободного места; — поддержанием соответствия между копиями одной и той же информации, располагающейся в разных ступенях памяти. Последнее иначе называют когерентностью данных, используя аналог физического термина. В зависимости от конкретной архитектуры и модели ЭВМ вышеназванные задачи могут решаться по-разному. Однако общие принципы их решения, в целом, схожи. Поскольку в кэш-памяти в каждый конкретный момент хранится только часть информации, размещенной в запоминающем устройстве более низкого уровня (для определенности, пусть это оперативная память), то при обращении к этому запоминающему устройству (со стороны процессора или другого узла) необходимо определить, не находится ли копия требуемой информации в кэш-памяти. Если она там есть, то обращение может быть быстро обслужено кэш-памятью, в противном случае, информацию придется извлекать из оперативной памяти (или заносить в нее), что займет примерно на порядок большее время. Определять, имеется ли запрошенная информация в кэш-памяти или нет, приходится в процессе обслуживания обращения к памяти. Понятно, что время этой операции непосредственно включается во время обращения и должно быть существенно меньше собственно времени обращения к кэшпамяти *) . Конечно, с точки зрения логики реализации такого поиска для этой цели хорошо подходит память с ассоциативным доступом (см. п. 1.2.2, подпункт 3 ). Однако такая память достаточно дорога, чтобы использовать ее в качестве кэш-памяти. Поэтому приходится либо прибегать к специальным ограничениям на место расположения информации в кэш-памяти, либо сочетать этот прием с ассоциативным доступом, что дает несколько различные схемы ее организации. Представителями этих вариантов являются кэш прямого отображения и наборно-ассоциативный кэш . Кэш прямого отображения Кэш прямого отображения представляет собой наиболее простой с точки зрения аппаратных затрат вариант решения задачи быстрого определения того, имеется ли в данный момент в кэш-памяти информация, затребованная очередным обращением к оперативной памяти (здесь и далее, *) Обычно обращение начинают сразу к оперативной и к кэш-памяти, и если информация будет найдена в кэш, то обращение к оперативной памяти прекращается.
как отмечалось, для определенности обсуждаются два смежных уровня системы памяти: кэш и оперативная память; ясно, что это должен быть кэш второго уровня L2). Это обеспечивается посредством жесткой привязки физических адресов оперативной памяти к адресам кэш-памяти . При такой организации кэш-памяти вся кэшируемая оперативная память (обычно, это было 64 Мбайта) условно разбивается на равные страницы, размер которых равен емкости кэш-памяти, что показано на рис. 40. Кэш, в свою очередь, разбивается на строки по 32 байта, соответствующие одному стандартному пакетному циклу обращения к динамической памяти (4 передачи по 8 байт). На такие же строки условно разделяются и страницы оперативной памяти. Именно такими строками и осуществляется обмен информацией между кэш-памятью и ОП, поскольку вероятность использования смежных слов памяти достаточно высока (так называемый принцип локальности обращений). При таком разбиении адрес кэшируемой памяти можно рассматривать как состоящий из трех частей, показанных в нижней части рисунка: — номера страницы оперативной памяти, называемого иначе тэгом и расположенного в старших разрядах адреса (разряды 25 – 18); — номера строки в странице, называемого индексом и занимающего средние разряды адреса (разряды 17 – 5); — номера байта в строке, занимающего младшие пять разрядов адреса.
Привязка адресов кэшируемой памяти к адресам кэш-памяти, о которой сказано выше, состоит в том, что в каждую строку кэш-памяти можно занести строку из любой страницы кэшируемой памяти, но только ту, которая имеет в странице такое же расположение относительно начала страницы, как и строка кэш-памяти, относительно ее начала. Иначе говоря, номер строки в странице оперативной памяти должен соответствовать индексу строки кэш-памяти, чтобы ее можно было туда занести. При этом, когда кэшируемая строка заносится в кэш-память, в память тэгов, каждая ячейка которой соответствует одной строке кэш-памяти, записывается номер страницы оперативной памяти, к которой относится занесенная в кэш строка. Такая организация и позволяет предельно быстро, не используя никаких поисковых схем, определить, находится ли в кэш-памяти строка, содержащая адрес оперативной памяти, по которому должно быть выполнено обращение. Для этого требуется только сравнить старшие разряды адреса, по которому выполняется обращение, т.е. его страницу или тэг, с тэгом строки кэш-памяти, которой этот адрес соответствует, что определяется его разрядами с 17-го по 5-й. Поэтому в начале каждого обращения контроллер памяти считывает соответствующий тэг из памяти тэгов по данному адресу. Если номер страницы и тэг совпадут, то искомая информация находится в кэш-памяти (это называют попаданием – hit – в кэш), в противном случае – в оперативной памяти (тогда говорят о кэш-промахе – miss ). Однако оперативная память используется не только процессором, имеются механизмы доступа к ней, минуя процессор. Поэтому может оказаться, что информация, хранящаяся в кэш-памяти, кэширует ту область ОП, в которую будет выполнена запись другим устройством. В этом случае будет нарушено соответствие между данными в кэш-памяти и в ОП. Для обработки таких ситуаций предусмотрен флаг V ( validity – действительность), устанавливаемый в единичное значение при загрузке строки в кэш-память и сбрасываемый в нулевое значение, если информация в оперативной памяти, копия которой имеется в кэш-памяти, была обновлена. Поэтому при определении того, находится ли запрошенная информация в кэш-памяти, производится не только сравнение тэга строки с номером страницы ОП, но и проверка действительности строки по значению флага V. Достоинствами кэш-памяти прямого отображения является высокая скорость определения того, имеется ли в ней запрашиваемая информация и простота его организации. В ней также не приходится решать вторую из названных выше задач управления кэш-памятью: определение строки – кандидата на удаление при необходимости ввода новой строки из ОП, поскольку место строк в кэше жестко привязано к их адресам в ОП. Но эта простота не лишена недостатков. Основной из них – это невысокая эффективность использования кэш-памяти, так как в ней нельзя разместить одноименные строки (группы строк) различных страниц.
Поэтому, если приложение работает с несколькими сегментами, одинаково расположенными в различных страницах памяти (например, выполняет операцию попарного умножения элементов двух массивов), кэш может оказаться даже своего рода “тормозом”, вызывающим интенсивный дополнительный обмен между оперативной памятью и кэшем. Если искомая информация находится в кэш-памяти, то процессор получает эту информацию непосредственно из кэша при чтении или записывает ее в кэш при записи. Обращение по чтению можно начинать сразу и к кэш-памяти и к оперативной памяти. Тогда, если информация отсутствует в кэш-памяти, к моменту установления этого факта будет уже выполнена часть цикла обращения к оперативной памяти, что может повысить производительность. Если информация имеется в кэше, то обращение к оперативной памяти можно остановить. Конечно, и здесь есть свои плюсы и минусы. При обращении по записи тоже возможны два варианта (две политики записи ): запись производится только в кэш или сразу и в кэш, и в оперативную память по месту расположения в ней этой информации. Эти два варианта получили название алгоритмов обратной записи WB ( Write Back ) и сквозной записи WT ( Write Through ) соответственно. Второй из них более простой, но и более медленный, хотя и гарантирует, что копии одной и той же информации в кэш-памяти и в оперативной памяти всегда совпадают. Большинство ранних процессоров Intel использовали именно этот алгоритм. Алгоритм обратной записи WB более быстродействующий, так как не требует при каждой записи обращаться к оперативной памяти. Запись информации в оперативную память производится только тогда, когда на место данной строки кэша вводится строка из другой страницы ОП или при выполнении команды обновления содержимого кэша. Следовательно, этот алгоритм более “тонкий” и требует более аккуратного управления, поскольку существуют моменты, когда копии одной и той же информации различны в кэше и ОП. Кроме того, для реализации обратной записи желательно наличие некоторых дополнительных средств: ведь не каждая строка изменялась за время своего пребывания в кэше, куда она изначально была загружена из оперативной памяти. Если изменений строки не было, то нет и необходимости записывать ее обратно в оперативную память. Для экономии времени на таких записях необходимо уметь определять, производились ли модификации строки за то время, пока она находилась в кэш-памяти. Для этой цели используют флаг M ( modified – изменена) в памяти тэгов, который сбрасывается в “0” при первоначальной загрузке строки в кэш и взводится в “1” при записи в нее информации. Тогда при выгрузке строки из кэша запись в ОП выполняется только при единичном значении флага M.
Наборно-ассоциативный кэш Устранить неэффективное использование места в кэш-памяти прямого отображения можно, применяя ассоциативный доступ. Однако, помимо того, что память с таким доступом более дорогая, она обеспечивает меньшую скорость поиска нужной информации (точнее, выявления факта ее наличия или отсутствия), чем рассмотренная выше схема прямого отображения. Поэтому полностью ассоциативный кэш используется редко и только на уровне L1. Как обычно, более приемлемым техническим решением оказывается сочетание механизма прямого отображения и ассоциативного поиска. Именно так и организован наборно-ассоциативный кэш, двухканальный ( two ways ) вариант которого показан на рис. 41, кэшируемая оперативная память на котором не показана (в отличие от предыдущего рисунка). Как видно, этот кэш, по сути, представляет собой сдвоенный кэш прямого отображения. Каждый банк кэш-памяти в паре со связанным с ним одним блоком тэговой памяти работает по схеме кэша прямого отображения. Однако наличие двух банков позволяет размещать в двухканальной наборноассоциативной кэш памяти сразу две строки, расположенные одинаково по отношению к границам двух различных страниц кэшируемой памяти. Например, на рис. 32 в строках банков кэш-памяти, имеющих индекс 1,
размещены строки с этим же индексом из 17-й и 255-й страниц кэшируемой памяти. При обращении к памяти поиск нужной строки в кэше выполняется точно так же, как и в кэш-памяти прямого отображения, только этот поиск производится сразу для двух банков (точнее, в двух блоках тэговой памяти). Собственно, в этом и заключается все, что можно отнести к термину “ассоциативный” в названии этого типа памяти. Однако это различие оказывается достаточным, чтобы заметно повысить вероятность нахождения в кэше нужной информации и производительность памяти в целом. На практике в процессорах начала 2000-х годов использовалась четырех- и восьмиканальная наборно-ассоциативная кэш-память второго уровня. На рис. 41 есть еще один блок – “флаги обращения”, который отсутствовал в кэш-памяти прямого отображения. Этот блок используется для решения второй из задач управления кэш-памятью: определением той строки, которую приходится удалять при необходимости ввода в кэш новой строки и отсутствии в нем свободного места. В кэш-памяти прямого отображения такую задачу решать не приходилось, так как место для размещения любой строки определялось однозначно и при вводе новой строки удалялась информация, которая ранее на этом месте располагалась. В рассматриваемой схеме ситуация несколько иная: здесь ввод новой строки можно выполнить в один из банков, но в какой? Для решения этой задачи используют специальные правила, называемые алгоритмами замещения . Эти правила используются во всех случаях, когда приходится вводить новую информацию в более быструю, но менее емкую ступень памяти из более медленной и более емкой. В данном разделе эти правила не рассматриваются, но одно из них, применяемое чаще всего, заключается в удалении той информации, к которой дольше всего не было обращений. В англоязычной литературе этот алгоритм называют LRU – least recently used , что буквально означает “наименее недавно использованный” или, говоря порусски, наиболее давно использованный. Для реализации этого алгоритма и нужны флаги обращения, в каждом из которых фиксируется, к какой из двух соответствующих флагу строк было последнее обращение. В двухканальной наборно-ассоциативной архитектуре для этого достаточно по одному биту на каждую пару строк. Решение задачи поддержания соответствия (целостности, когерентности) между копиями одной и той же информацией в кэш- и оперативной памяти не зависит от организации кэш-памяти. Это соответствие может нарушиться в тех случаях, когда какой-либо блок ЭВМ производит запись отдельно либо в кэш, либо в ОП. Таким блоком может быть или процессор, или иное устройство (пока речь идет об однопроцессорной системе). Выполнить запись в кэш-память может только процессор (если не считать процедуру загрузки строки в кэш). Поэтому временное
несоответствие информации в кэш-памяти и в ОП может возникнуть только при использовании политики обратной записи (см. выше). Однако за поддержанием целостности информации в этом случае следит контроллер. Запись только в ОП может выполнить другое устройство (например, по шине PCI), причем если эта запись производится в ту область ОП, копия информации из которой имеется и в кэш-памяти, то эту копию следует пометить как недействительную. Несколько более сложные проверки приходится выполнять в многопроцессорных системах, так как в них может существовать сразу больше двух копий информации, например, одни и те же данные могут быть кэшированы несколькими процессорами. Процессоры семейства x86 Intel поддерживают специальный протокол слежения за состоянием данных в кэш-памяти, называемый по первым буквам различимых состояний строк кэша MESI ( Modified – Exclusive – Shared – Invalid – модифицированная, монопольная (в одном кэше), разделяемая (может находиться в нескольких кэшах) и недействительная (отсутствует в кэше или содержит устаревшую информацию)). 4.2.2. Диспетчеризация (управление порядком) обслуживания обращений Управление порядком обслуживания (диспетчеризация) обращений к запоминающим устройствам с механическими перемещениями носителей информации и механизмов чтения/записи является программным способом повышения производительности памяти. Такой подход оказывается возможным, поскольку времена, затрачиваемые на выполнение этих перемещений, достигают значительных величин (до единиц – десятков миллисекунд). Наиболее распространенным примером реализации данного подхода является обработка обращений к жесткому диску. Как известно (см. также раздел 1.1), процесс обслуживания обращения к диску складывается из трех стадий: перемещения блока головок чтения/записи на нужный цилиндр, ожидания подвода требуемого сектора и передачи данных. Времена всех трех этапов имеют один порядок, если передаваемый файл имеет размер до нескольких сот килобайт. Для более коротких файлов времена подготовительных (поисковых) фаз имеют еще больший вес. Время перемещения головок чтения/записи зависит от количества цилиндров, на которое их требуется переместить. Минимальное время (порядка 1-2 мс) затрачивается на переход на соседний цилиндр, максимальное (до 15-20 мс) – на перемещения от первого (внешнего) цилиндра диска к последнему (внутреннему) или наоборот. В обычном режиме обращения к диску обслуживаются в порядке их поступления ( первый пришел – первый обслужен – ПППО). Но время перемещения блока головок чтения/записи, и, следовательно, время
обслуживания обращения зависит от взаимного физического расположения на диске файлов обращений, обслуживаемых друг за другом. Поэтому напрашивается решение об обслуживании обращений в таком порядке, который минимизирует времена, затрачиваемые на перемещение головок. Такую дисциплину обслуживания называют МВДП – “минимальное время доступа – первый”. И действительно, пусть к жесткому диску имеется очередь из обращений, ожидающих обслуживания, файлы которых расположены на диске так, как показано на рис. 42, причем цифры – означают порядок, в котором поступили обращения. Тогда порядок их обслуживания, при котором путь перемещения блока головок чтения/записи будет минимальным, следующий: 1 – 5 – 4 – 3 – 2, то есть не совпадает с порядком их поступления. Тогда, если обращения обслуживать в том порядке, для которого перемещения блок головок чтения/записи минимальны, сократится среднее время, затрачиваемое на первую фазу обращения – установку головок, а общая пропускная способность дискового ЗУ возрастет. Причем, чем больше очередь обращений к диску, тем больше будет эффект от использования этого способа. Однако было установлено, что этот алгоритм выбора на обслуживание обращений, адресующихся к ближайшим по отношению к текущему положению головок чтения/записи цилиндрам приводит к “дискриминации” обращений, адресующихся к цилиндрам, более удаленным от средней дорожки (т.е. расположенным на крайних и на центральных дорожках). Время ожидания в очереди для таких обращений возрастает, причем этот рост может быть весьма значительным. Поэтому на практике используют несколько иной порядок обслуживания, который если и не дает минимально возможного суммарного
перемещения блока головок, но и не приводит к чрезмерным задержкам в обслуживании отдельных обращений. Такая дисциплина обслуживания, к тому же простая в реализации, называется дисциплиной сканирования (СКАН). При этой дисциплине блок головок чтения/записи, обслуживая обращения, перемещается от края диска к центру и обратно, меняя направление движения лишь у первого (внешнего) и последнего (внутреннего) из цилиндров, на которых расположены файлы обслуженных обращений. При этом из очереди выбирается к обслуживанию обращение, адресующееся к цилиндру (дорожке), находящемуся ближе всего к головкам в направлении их движения. Т.е. имеет место нечто похожее на работу стеклоочистителя автомобиля. Например, если на рис. 42 блок головок чтения/записи движется в направлении к центру диска, то после передачи данных для обращения 1 будет начато обслуживание обращения 3. Если же головки двигаются в обратном направлении, то следующим будет обслужено обращение 5. Дисциплина СКАН может быть реализована как программно, так и аппаратно. Многие операционные системы поддерживают подобные стратегии. Известны и другие разновидности дисциплин обслуживания обращений. 4.2.3. Организация дисковых массивов (RAID) Еще одним способом повышения производительности дисковой памяти стало построение дисковых массивов, хотя этот нацелен не только (и не столько) на достижение более высокой производительности, но и большей надежности работы запоминающих устройств на дисках. Технология RAID ( Redundant Array of Independent Disks – избыточный массив независимых дисков) задумывалась как объединение нескольких недорогих жестких дисков в один массив дисков для увеличения производительности, объема и надежности, по сравнению с одиночным диском. При этом ЭВМ должна видеть такой массив как один логический диск. Если просто объединить несколько дисков в (неизбыточный) массив, то среднее время между отказами (СВМО) будет равно СВМО одного диска, деленному на количество дисков. Такой показатель слишком мал для приложений, критичных к аппаратным сбоям. Улучшить его можно применяя реализуемую различным образом избыточность при хранение информации. В RAID системах для повышения надежности и производительности используются комбинации трех основных механизмов, каждый из которых хорошо известен и по отдельности: — организация “зеркальных” дисков, т.е. полное дублирование хранимой информации;
— подсчет контрольных кодов (четность, коды Хэмминга), позволяющих восстановить информацию при сбое; — распределение информации по различным дискам массива так, как это делается при чередовании обращений по блокам памяти (см. interleave ), что повышает возможности параллельной работы дисков при операциях над хранимой информацией. При описании RAID этот прием называют “stripped disks”, что буквально означает “разделенные на полоски диски”, или просто “полосатые диски”. Эти полоски (далее называемые блоками) данных с каждого диска чередуются, как показано на рис. 43 для случая массива из четырех дисководов, образуя единый логический диск. Видно, что этот рисунок очень похож на Рис. 6 . Рис.43. Разбиение дисков на чередующиеся блоки — “полоски” Изначально было определено пять типов дисковых массивов, обозначаемых RAID 1 – RAID 5, различающихся по своим особенностям и производительности. Каждый из этих типов за счет определенной избыточности записываемой информации обеспечивал повышенную отказоустойчивость по сравнению с одиночным дисководом. Кроме того, массив дисков, не обладающих избыточностью, но позволяющий повысить производительность (за счет расслоения обращений), стали часто называть RAID 0. Основные типы RAID массивов можно кратко охарактеризовать следующим образом [14]. RAID 0 . Обычно этот тип массива определяется как группа дисков с чередованием ( stripped ) расположения информации без контроля четности и без избыточности данных. Размеры чередующихся областей ( stripes – “полосок”, или блоков) могут быть большими в многопользовательском окружении или малыми в однопользовательской системе при последовательном доступе к длинным записям. Организация RAID 0 как раз и соответствует той, которая показана на рис. 43. Операции записи и чтения могут выполняться одновременно на каждом дисководе. Минимальное количество дисководов для RAID 0 – два.
Для этого типа характерны высокая производительность и наиболее эффективное использование дискового пространства, однако выход из строя одного из дисков приводит к невозможности работы со всем массивом. RAID 1 . Этот тип дискового массива (рис. 44, а ) известен также как зеркальные диски и представляет собой просто пары дисководов, дублирующих хранимые данные, но представляющиеся компьютеру как один диск. И хотя в рамках одной пары зеркальных дисков разбиение на полоски не производится, чередование блоков может быть организовано для нескольких массивов RAID 1, образующих вместе один большой массив из нескольких зеркальных пар дисков. Такой вариант организации получил название RAID 1 + 0. Есть и обратный вариант. Все операции записи производятся одновременно в оба диска зеркальной пары, чтобы информация в них была идентична. Но при чтении каждый из дисков пары может работать независимо, что позволяет выполнять одновременно две операции чтения, удваивая тем самым производительность при чтении. В этом смысле RAID 1 обеспечивает наилучшую производительность среди всех вариантов дисковых массивов. RAID 2 . В этих дисковых массивах блоки – сектора данных чередуются по группе дисков, часть из которых используется только для хранения контрольной информации – ECC ( error correcting codes ) кодов. Но поскольку во всех современных дисках имеется встроенный контроль с помощью ECC кодов, то RAID 2 мало что дает, по сравнению с другими типами RAID, и сейчас редко используется. Рис. 44. Варианты организации дисковых массивов RAID: а ) RAID 1, б ) RAID 3, в ) RAID 4, г ) RAID 5 (дисководы и блоки, используемые для хранения кодов четности показаны затененными).
RAID 3 . Как и в RAID 2 в этом типе дискового массива (рис. 44, б ) блоки –сектора чередуются по группе дисков, но один из дисков группы отведен для хранения информации о четности. В случае выхода дисковода из строя восстановление данных осуществляется на основе вычисления значений функции “исключающее ИЛИ” (XOR) от данных, записанных на оставшихся дисках. Записи обычно занимают все диски (так как полоски короткие), что повышает общую скорость передачи данных. Так как каждая операция ввода-вывода требует доступа к каждому диску, массив RAID 3 может обслужить в каждый момент времени только один запрос. Поэтому данный тип обеспечивает наилучшую производительность для одного пользователя в однозадачном окружении с длинными записями. При работе с короткими записями во избежание снижения производительности требуется синхронизация шпинделей дисководов. По своим характеристикам RAID 3 близок к RAID 5 (см. ниже). RAID 4 . Эта организация, показанная на рис. 44, в ), похожа на RAID 3 с той лишь разницей, что в нем используются блоки (полоски) большого размера, так что записи можно читать с любого диска массива (кроме диска, хранящего коды четности). Это позволяет совмещать операции чтения на разных дисках. При операциях записи всегда происходит обновление диска четности, поэтому их совмещение невозможно. В целом, данная архитектура не имеет особых преимуществ перед другими вариантами RAID. RAID 5 . Этот тип дискового массива похож на RAID 4, но хранение кодов четности в нем осуществляется не на специально выделенном диске, а блоками, располагающимися поочередно на всех дисках. Эту организацию даже иногда называют массив с “вращающейся четностью” (можно отметить некую аналогию с назначением линий прерываний для слотов шины PCI или с циклическим приоритетом контроллера прерываний в процессорах линии x86). Такое распределение позволяет избежать ограничения возможности одновременной записи из-за хранения кодов четности только на одном диске, характерного для RAID 4. На рис. 44, г ) показан массив, состоящий из четырех дисководов, причем для каждых трех блоков данных имеется один блок четности (эти блоки заштрихованы), местоположение которого для каждой тройки блоков данных изменяется, перемещаясь циклически по всем четырем дисководам. Операции чтения могут выполняться параллельно для всех дисков. Операции записи, требующие участия двух дисководов (для данных и для четности) обычно также могут совмещаться, так как коды четности распределены по всем дискам. Сравнение различных вариантов организации дисковых массивов показывает следующее.
Организация RAID 0 – это наиболее быстрый и эффективный вариант, но не обеспечивающий устойчивости к сбоям. Он требует минимум 2 дисковода. Операции записи и чтения могут выполняться одновременно на каждом дисководе. Архитектура RAID 1 наиболее пригодна для высокопроизводительных высоконадежных приложений, но и наиболее дорогая. Кроме того, это единственный вариант, устойчивый к сбоям, если используются только два дисковода. Операции чтения могут выполняться одновременно для каждого дисковода, операции записи всегда дублируются для зеркальной пары дисководов. Архитектура RAID 2 используется редко. Дисковый массив типа RAID 3 можно использовать для ускорения передачи данных и повышения устойчивости к сбоям в однопользовательской среде при последовательном доступе к длинным записям. Но он не позволяет совмещать операции и требует синхронизации вращения шпинделей дисководов. Для него нужно, как минимум, три дисковода: 2 для данных и один для кодов четности. Архитектура RAID 4 не поддерживает одновременные операции и не имеет преимуществ, по сравнению с RAID 5. Организацию RAID 5 характеризует эффективность, устойчивость к сбоям и хорошая производительность. Но производительность при записи и в случае отказа дисковода хуже, чем у RAID 1. В частности, поскольку блок кодов четности относится ко всему записываемому блоку, то, если пишется только часть его, необходимо сперва считать ранее записанные данные, затем вычислить новые значения кодов четности и только после этого записать новые данные (и четность). Операции перестройки также требуют больше времени из-за необходимости формирования кодов четности. Для данного типа RAID нужно, как минимум, три дисковода. Кроме того, на основе наиболее распространенных вариантов RAID: 0, 1 и 5 могут формироваться так называемые двухуровневые архитектуры, в которых сочетаются принципы организации различных типов массивов. Например, несколько RAID массивов одного и того же типа можно объединить в одну группу массивов данных или массив четности. За счет такой двухуровневой организации можно достичь требуемого баланса между увеличением надежности хранения данных, характерным для массивов RAID 1 и RAID 5 и высокой скоростью чтения, присущей чередованию блоков на дисках в массиве типа RAID 0. Такие двухуровневые схемы иногда называют RAID 0+1 или 10 и 0+5 или 50. Управление работой RAID массивов может осуществляться не только аппаратно, но и программно, возможность чего предусматривается в некоторых серверных вариантах операционных систем. Хотя понятно, что такая реализация будет иметь существенно худшие характеристики производительности.
Многоуровневая организация кэша
Все современные процессоры имеют как минимум двухуровневую структуру кэшпамяти, а большинство процессоров Intel — трехуровневую кэшпамять. При этом различают кэш первого уровня (обозначается L1), кэш второго уровня (L2) и кэш третьего уровня (L3). Причем в случае процессоров Intel кэши всех уровней размещены на кристалле процессора.
Казалось бы, зачем нужно делать так много кэшей? Не проще ли создать один большой кэш? Оказывается, не проще. Проблема заключается в том, что чем больше размер кэша, тем ниже его скорость. То есть можно сделать один большой, но медленный кэш, а можно — несколько маленьких, но быстрых кэшей, и второй вариант оказывается более предпочтительным.
Кроме того, кэши разных уровней в процессоре выполняют различные задачи. Так, самый быстрый и маленький кэш первого уровня L1 всегда делится на кэш данных (L1D) и кэш команд или инструкций (L1I). Это так называемая гарвардская архитектура процессора. Кэш L1 всегда принадлежит только конкретному ядру процессора.
Кэш второго уровня L2 является уже унифицированным (содержит и данные и команды). Кэш L2 всегда больше, чем кэш L1, но медленнее его. В случае многоядерных процессоров кэш L2 принадлежит конкретному ядру процессора.
А вот кэш L3 является самым большим и медленным и разделяется между всеми ядрами процессора (в архитектуре процессоров Intel).
Понятно, что в случае, когда в процессоре имеется многоуровневая система кэшпамяти, необходимо организовать взаимодействие между кэшами разных уровней.
Для начала рассмотрим двухуровневую систему кэша. Такая кэшпамять строится на базе одной из двух архитектур: включающей, которую также называют инклюзивной (inclusive), и исключающей, именуемой эксклюзивной (exclusive). То есть кэш L2 всегда построен либо по включающей, либо по исключающей архитектуре по отношению к кэшу L1 (отметим, что при наличии кэша L3 кэши L2 и L1 могут быть и не включающими, и не исключающими по отношению друг к другу).
Кэш L2, построенный по включающей архитектуре, всегда дублирует содержимое кэша L1, а потому эффективная емкость кэшпамяти равна емкости кэша L2.
Кэш L2, построенный по исключающей архитектуре, никогда не дублирует содержимое кэша L1, а потому эффективная емкость кэшпамяти равна суммарной емкости кэшей L1 и L2.
Пусть кэш имеет включающую архитектуру. Рассмотрим, каким образом происходит запись данных из оперативной памяти в такой кэш. Если в такой системе кэшпамяти при полностью заполненном кэше L2 процессор пытается загрузить еще одну кэшстроку, то произойдет следующее. Обнаружив, что все кэшстроки заняты, кэш L2 избавляется от наименее ценной из них, стремясь при этом найти линейку, которая еще не была модифицирована, поскольку в противном случае ее еще придется выгружать в оперативную память.
Затем кэш L2 передает полученные из памяти данные кэшу L1. Если кэш первого уровня также заполнен, ему приходится избавляться от одной из кэшстрок по сценарию, описанному выше.
Таким образом, загруженная порция данных присутствует и в кэше L1, и в кэше L2.
Отметим, что процессоры Intel Pentium II и Pentium III имели двухуровневый кэш, построенный по включающей архитектуре.
В случае кэша, построенного по исключающей архитектуре, кэш L1 никогда не уничтожает кэшстроки при нехватке места. Даже если кэшстроки не были модифицированы, они вытесняются в кэш L2 на то место, где находилась только что переданная кэшу L1 кэшстрока. То есть кэши L1 и L2 как бы обмениваются друг с другом своими кэшстроками, благодаря чему кэшпамять используется весьма эффективно.
Кэш процессора: описание, уровни, особенности
При выборе процессора многие люди обращают внимание на такие характеристики как тактовая частота и количество ядер в оборудовании. А вот кэш-память рассматривается поверхностно. А зря, ведь малый объем кэша процессора может доставить ряд проблем в процессе работы компьютера или ноутбука.
Далее предстоит изучить кэш, а также его уровни и особенности. Нужно разобраться с областями применения этого параметра, его ключевыми функциями. Предложенная информация пригодится как IT-специалистам, так и обычным пользователям, планирующим покупку/сборку нового компьютера.
Определение
Кэш – один из уровней памяти устройства или программы. Это высокоскоростное буферное хранилище, в котором размещаются необходимые данные. Обычно кэш имеет небольшой размер и содержит в себе временную информацию или то, к чему пользователь обращается чаще всего.
Аппаратный кэш устройства – сервера, компьютера, телефона – это специальный участок памяти, имеющий особую архитектуру. Кэш приложений и сервисов обычно размещается в обычной памяти, в папках на оборудовании или на отдельных серверах.
Кэш процессора – это очень быстрый участок памяти, который включает в себя инструкции, необходимые устройству для обработки той или иной задачи. Компьютер загрузит соответствующие данные в кэш при помощи сложных алгоритмов. Цель такой системы – обеспечение беспрепятственного доступа ЦПУ к нужным данным в том или ином порядке.
Функции cash-памяти процессора
Процессор работает с информацией, которая поставляется ему из оперативной памяти. В процессе взаимодействия этих двух составляющих компьютера возникает проблема – ОЗУ работает намного медленнее, чем процессор. Это значит, что будут возникать регулярные простои – пока оперативная память отправит необходимые CPU данные.
Для устранения соответствующей проблемы в кристалл чипа процессора интегрируется кэш-память. Она выполняет собой своеобразную роль буфера между оперативной памятью и CPU. Загружает и хранит в себе информацию, с которой на данный момент работает процесс.
Кэш предназначается для того, чтобы устранять разницу в скорости работы между процессором и оперативной памятью. Это благоприятно сказывается на производительности устройства. Также рассматриваемый элемент занимается перепаковкой информации, чтобы процессор лучше понимал их, рассчитывал и возвращал обратно.
Устройство кэш-памяти
Для понимания принципов работы кэша необходимо разобраться с его устройством. Система процессорного кэша включает в себя два ключевых элемента:
- контроллер;
- сама кэш-память.
Если говорить простыми словами, то cash – это склад, место хранения, а контроллер – погрузчик, который передвигается по складу и поставляет ближе к процессору нужные ящики (блоки) данных.
Контроллер
Контроллер – первый блок рассматриваемого процессорного элемента. Он отвечает за управление содержимым кэша. Все время проверяет, что приходит из оперативной памяти, было обработано и возвращено обратно.
Контроллеры обычно устанавливаются внутри чипов, но до Intel Nehalem и AMD64 они устанавливались на серверном мосту.
При обращении одного ядра к контроллеру за данными, последний проверит их наличие в кэше. Если они обнаружены, система передает сведения (процесс называется кэш-попаданием), если нет – ядро начинает ждать ответа от оперативной памяти (кэш-промах).
Ключевая задача контроллера – это минимизирование количества промахов или сведение их к нулю. Этот элемент будет следовать загруженным в него алгоритмам для расчета того, какие данные могут пригодиться процессору, а затем заранее загружать их. Если контроллер справился, он запоминает опыт как удачный. В противном случае опыт бракуется, логика выбора информации для предварительной загрузки меняется.
Современные контроллеры функционируют с возможностью глубокого самообучения и аналитики, что благоприятно сказывается на количестве промахов. Чем дольше оборудование работает в системе, тем лучше оно понимает пользовательские требования и выдает необходимые результаты.
Строение памяти
Кэш-память – это модуль. Отдельная, размещенная на плате ЦПУ микросхема SRAM (Static Random Access Memory), имеет высокую скорость работы. Это объясняется тем, что оперативная память (DRAM) использует в процессе функционирования конденсаторы, а SRAM – транзисторы. Такая концепция приводит к приросту скорости не менее чем в 10 раз.
SRAM имеет несколько проблем, которые будут ограничивать возможности ее использования. Первый момент – это то, что транзисторная память требует намного больше места на кристалле процессора, поэтому ее не поставить. Пример – 100 МБ SRAM = 4 ГБ DRAM в плане габаритов.
Второй момент – чем больше объем SRAM, тем ниже скорость и выше задержки. Из-за этого производители процессоров придумали хитрый способ обхода данной проблемы. Они разделили весь кэш на несколько блоков разного размера. Это «фрагменты» получили название уровней (Layers).
Уровни
Современные процессоры имеют несколько уровней кэша:
- L1 – обладает самой большой скоростью и самым маленьким объемом;
- L2 – большой по объему, но не такой быстрый, как L1;
- L3 – наиболее медленный и обширный уровень.
Выше можно увидеть наглядную схему расположения уровней. Здесь отражен принцип работы с данными. Схема демонстрирует принципы передачи информации от хранилища к оперативной памяти, а от нее – к кэш-памяти L3-L2-L1 и непосредственно до процессора. Обмен данными закольцован.
В кристалле центрального процессора размещаются арифметическо-логические устройства (ALU), которые производят необходимые математические расчеты. В этом им помогают регистры, которые представляют собой SRAM-память, но в техническом смысле не относятся к кэшу.
Каждый регистр имеет одно из 64-битных целых чисел, а в качестве значения может выступать фрагмент данных, блок кода, ссылка на другой регистр. Сам регистр не может хранить в памяти что-либо, поэтому он использует кэш L1.
L1 – 1 уровень
L1 – память первого уровня. Она является самой маленькой в плане размера (объема), но очень быстрый по вычислительным способностям. На данном уровне регистрам передается важная информация, которая не должна простаивать. На уровне L1 скомпилированы данные, к которым процессор обращается чаще всего.
Количество микросхем L1 обычно привязывается к количеству ядер процессора – у каждого ядра имеется свой кэш. Размер блока составляет от 64 до 256 Кб у стационарных компьютеров и ноутбуков, а также до 1-2 Мб на серверах.
L1 – уровень, который тоже имеет собственное разделение:
- командный кэш;
- информационный кэш.
Первый «блок» включает в себя данные об операции, которой занимается на данный момент центральный процессор. Второй используется для хранения информации, с которой производятся те или иные вычисления.
L2 – 2 уровень
L2 – память второго уровня. Это не такой быстрый тип памяти, но его скорость работы перекрывается повышенным объемом. Данный «блок» привязан к ядру и не взаимодействует с остальными компонентами.
L2 можно представить «личным хранилищем» для L1: когда первому уровню не хватает пространства под определенные, не самые критические операции, он будет загружать их в кэш второго уровня.
L3 – 3 уровень
L3 – память третьего уровня. Это самый медленный кластер из всех существующих. L3 имеет самый большой объем. Уровень работает быстрее оперативной памяти, SSD-накопителей.
Соответствующий блок доступен всем ядрам процессора и представляет собой «общественную библиотеку». На третьем уровне размещаются данные временного характера – они необходимы для продуктивного функционирования, но регистры сюда обращаются относительно нечасто. На форме L1 и L2 объем памяти L3 может оказаться колоссально гигантский. Пример – для Intel Xeon 3 Gen он достигает до 80 Мб, а для AMD – 256 Мб.
Влияние кэша на производительность
От количества ядер и назначения процессора зависит его производительность. Перед производителями ЦП стоит задача по выпуску максимально сбалансированного продукта, который будет отвечать пользовательским потребностям.
Для примера можно взять стандартный домашний компьютер с 4-ядерным процессором и частотой около 3 ГГц. Он используется для:
- простых игр;
- таблиц;
- текстовых редакторов;
- офисных приложений;
- работы с мультимедиа;
- других развлекательных сервисов.
Для такого устройства достаточно L1 на 256 Кб, L2 – до 1 Мб, L3 – 4 Мб (суммарно). Задача производительности процессора решается оптимизацией кэша, которая приводит к 90 % кэш-попаданий на всех этапах работы. Промахами заканчиваются около 1-2 % всех операций. Производители процессоров понимают – наращивание показателей не увеличит производительности, зато сильно скажется на стоимости оборудования. Итоговая цена компьютера станет слишком большой.
В случае с серверным кластером давно началось использование кристаллов на 16, 32 или 64 ядра. В таких процессорах требуется объемный кэш. Связано это с тем, что оборудование с небольшой памятью не сможет обеспечить серверу высокую вычислительную скорость для выстроенных задач.
Это влечет за собой появление гигантских L3 – на 128 или 256 Мб памяти. Подобные показатели характерны для AMD EPYC 2 и 3 поколений. Больше места для быстрого доступа – это значит, что производительность процессора и устройства окажется выше.
Можно ли увеличить процессорный кэш
Для чего нужна кэш-память процессора, понятно. У некоторых пользователей возникает вопрос о возможности увеличения этого параметра. Расширить кэш можно, но только через установку дополнительных плат. Это не всегда востребовано.
Самый простой вариант увеличения кэша – замена процессора на более мощный. Стоит обратить внимание на то, что при переходе со 2-го на 3-е поколение чипов Intel/AMD разница окажется только в росте базовой тактовой частоты ядра. Если переходить с 1-го поколения на 3-е, прирост производительности окажется более значительным. Других вариантов увеличения кэша пока не придумано.
Советы по выбору
Где находится кэш-память процессора, а также для каких целей она требуется, понятно. При выборе компьютера и ЦП необходимо обращать внимание на соответствующий параметр. Совет здесь один – учитывать потребности конечного пользователя:
- Для настольных компьютеров размер кэша практически не имеет значения. Более 90 % типовых задач все равно будут успешно выполнены. Основная масса пользователей работают за настольными компьютерами в Интернете, посещают социальные сети, смотрят видео. Для них не имеет никакого значения уровни L1/L2/L3, как и общее время задержки при обращении от процессора к оперативной памяти и наоборот.
- Вторая пользовательская категория – IT-специалисты. Для них компьютеры – это полноценные рабочие станции. Здесь значение имеют «промежуточные» процессоры вроде Intel Core X или AMD Threadripper. У них больше ядер и хорошая производительность. Размер кэша тоже значительный. Суммарная производительность в таких устройствах будет увеличена.
- Для серверов нужны наиболее производительные процессоры. В них кэш – одна из ключевых характеристик. Если взять две модели компьютеров с одинаковыми характеристиками (пример – для выстраивания терминальной сети), лучше окажется тот, в котором L3 выше при прочих равных показателях.
Эти советы помогут грамотно подобрать процессор с оптимальным размером кэша.
Программный кэш
При работе с компьютерами пользователям предстоит иметь дело не только с кэшем процессора, но и программным кэшем. Это хранилище для временных или часто используемых данных приложения. Обычно описывается программным кодом.
Кэшированные данные записываются несколькими способами:
- Сквозным методом. Сначала данные оказываются в основной памяти, а затем дублируются в кэш.
- Отложенным методом. Информация кэшируется, а по истечении определенного времени или вытеснении – переносятся в основную память.
Иногда кэширование файлов приводит к некорректной работе устройства или приложения. Такая проблема часто встречается в браузерах. Из-за этого программный кэш рекомендуется регулярно подчищать. В противном случае при обновлении информации на сайте браузер может загрузить устаревшую версию контента.
Для очистки кэш-памяти и загрузки актуального содержимого достаточно на активной странице нажать сочетание клавиш Ctrl + F5. Сайт перезагрузится с обновленным наполнением.
Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в Otus !