Открыть сервис

Буфер ассоциативной трансляции

Буфер ассоциативной трансляции (англ. Translation Lookaside Buffer, TLB) — это специализированный кэш, используемый процессором для ускорения преобразования виртуальных адресов в физические. TLB является частью блока управления памятью (MMU) и хранит недавно использованные соответствия между страницами виртуальной памяти и физическими кадрами. За счёт высокой скорости доступа, которая значительно превышает скорость обращения к таблицам страниц в оперативной памяти, TLB позволяет существенно сократить задержки при выполнении программ, работающих с виртуальной памятью.

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

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

При каждом обращении к памяти процессор сначала проверяет наличие записи о виртуальном адресе в TLB. Если запись найдена (попадание в TLB, TLB hit), процессор мгновенно получает соответствующий физический адрес и выполняет доступ к данным. Если запись отсутствует (промах TLB, TLB miss), MMU обращается к таблице страниц в оперативной памяти, находит нужное преобразование, выполняет доступ к данным и одновременно помещает новую запись в TLB для ускорения будущих обращений.

Структура TLB

TLB представляет собой ассоциативную память (content-addressable memory, CAM), где поиск записи осуществляется не по адресу ячейки, а по содержимому — в данном случае по ключу, которым является номер виртуальной страницы. Каждая запись в TLB содержит:

  • Тег (tag) — номер виртуальной страницы.
  • Физический номер кадра (physical frame number) — соответствующий физический адрес.
  • Биты атрибутов — флаги, указывающие на права доступа (чтение, запись, исполнение), бит присутствия, бит модификации, бит обращения и другие.

В современных процессорах TLB обычно разделён на два независимых кэша: один для инструкций (ITLB) и один для данных (DTLB). Это позволяет одновременно выполнять выборку инструкций и обращение к данным без конфликтов.

Типы TLB

По способу организации ассоциативности TLB делятся на несколько типов.

Полностью ассоциативный TLB

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

Частично ассоциативный (set-associative) TLB

Это наиболее распространённый тип в современных процессорах. Кэш разбивается на наборы (sets), каждый из которых содержит несколько строк (ways). Виртуальная страница по определённому алгоритму (обычно по младшим битам адреса) отображается в конкретный набор, а внутри набора запись может быть помещена в любую из строк. Поиск ведётся только в одном наборе, что упрощает схему по сравнению с полностью ассоциативным TLB. Типичные значения: 4- или 8-канальный TLB с 64–512 записями.

Прямой (direct-mapped) TLB

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

Иерархия TLB

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

  • L1 TLB — самый быстрый и маленький (обычно 32–64 записи), расположен непосредственно рядом с ядром процессора. Обслуживает обращения с минимальной задержкой (1–2 такта).
  • L2 TLB — большего размера (от 256 до 2048 записей), но с несколько большей задержкой (5–10 тактов). Используется как резервный кэш при промахе в L1 TLB.

В некоторых архитектурах (например, Intel x86-64) существует также объединённый TLB (unified TLB), который обслуживает как инструкции, так и данные, но обычно на втором уровне.

Промахи TLB и их последствия

Промах TLB (TLB miss) приводит к тому, что процессор вынужден обращаться к таблице страниц в оперативной памяти. Это может быть выполнено аппаратно (за счёт MMU) или программно (через обработчик прерывания операционной системы). В современных процессорах x86-64 используется аппаратный обход таблицы страниц (page walk), который может занимать от нескольких десятков до сотен тактов в зависимости от глубины вложенности таблиц.

Существует два основных типа промахов:

  • Промах по данным (data TLB miss) — возникает при обращении к данным в памяти.
  • Промах по инструкциям (instruction TLB miss) — возникает при выборке кода инструкции.

Частота промахов TLB существенно влияет на производительность. Для приложений с большим рабочим набором памяти (например, базы данных, научные расчёты) промахи TLB могут стать узким местом.

Управление TLB в операционных системах

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

  • Полная очистка TLB (TLB flush) — все записи помечаются как недействительные. Это простой, но дорогой метод, особенно на системах с большим TLB.
  • Поддержка тегов адресного пространства (Address Space ID, ASID) — каждая запись TLB помечается идентификатором процесса. При переключении контекста очистка не требуется, так как записи разных процессов различаются по ASID. Этот метод используется в большинстве современных процессоров (ARM, x86-64 с поддержкой PCID).

Операционная система также может принудительно инвалидировать отдельные записи TLB при изменении таблиц страниц (например, при освобождении памяти или изменении прав доступа).

Влияние на производительность

Эффективность TLB оценивается коэффициентом попаданий (hit rate), который для типичных приложений составляет 95–99 %. Однако для приложений с большим рабочим набором памяти (например, обработка больших массивов данных) коэффициент попаданий может существенно снижаться. В таких случаях используются большие страницы (large pages, huge pages) размером 2 МБ или 1 ГБ, которые позволяют одной записи TLB покрывать больший диапазон виртуальной памяти. Это уменьшает количество записей в TLB и снижает частоту промахов.

Современные процессоры также поддерживают предварительную выборку записей в TLB (prefetching), что позволяет снизить задержки при последовательном доступе к памяти.

Примеры реализации

  • Архитектура x86-64 (Intel, AMD) — использует два уровня TLB: L1 TLB (раздельный для инструкций и данных, по 64 записи) и L2 TLB (объединённый, до 1536 записей). Поддерживает страницы размером 4 КБ, 2 МБ и 1 ГБ.
  • ARM Cortex-A — в зависимости от поколения, L1 TLB содержит 32–64 записи, L2 TLB — до 1024 записей. Использует ASID для поддержки нескольких процессов.
  • RISC-V — архитектура не предписывает жёсткой реализации TLB, но большинство коммерческих ядер (например, SiFive U74) включают TLB с поддержкой страниц различных размеров.

Критика и ограничения

Основным ограничением TLB является его размер. Из-за физических ограничений кристалла и энергопотребления TLB не может быть слишком большим. Это приводит к тому, что приложения с большим объёмом рабочего набора памяти (например, базы данных, работающие с терабайтами данных) могут испытывать значительное снижение производительности из-за частых промахов TLB.

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

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →