Разделяют ли многоядерные процессоры MMU и таблицы страниц? - PullRequest
16 голосов
/ 29 марта 2012

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

Мне интересно, как обстоят дела на многоядерном компьютере.Я предполагаю, что на каждом ядре есть выделенный MMU, и если два потока одного и того же процесса работают одновременно на двух ядрах, каждый MMU этого ядра просто ссылается на одну и ту же таблицу страниц.Это правда ?Можете ли вы указать мне хорошие ссылки на эту тему?

Ответы [ 6 ]

15 голосов
/ 10 сентября 2012

Взгляните на эту схему.Это общий обзор всего, что есть в одном ядре процессора Corei7.Картинка взята из «Компьютерные системы: взгляд программиста», Брайанта и Халларона.Вы можете получить доступ к диаграммам в здесь , раздел 9.21.

Computer Systems: A Programmer's Perspective, 2/E (CS:APP2e)Randal E. Bryant and David R. O'Hallaron, Carnegie Mellon University

5 голосов
/ 20 октября 2015

TL; DR - существует отдельный MMU на процессор, но MMU, как правило, имеет несколько УРОВНЕЙ таблиц страниц, и они могут совместно использоваться.

Например, в ARM верхнего уровня (PGD ​​ или имя глобального каталога страниц, используемое в Linux), занимает 1 МБ адресного пространства.В простых системах вы можете отобразить в разделах 1 МБ.Однако обычно это указывает на таблицу 2-го уровня ( PTE или запись в таблице страниц).

Один из способов эффективной реализации многопроцессорных систем - это отдельный отдельный верхний уровень PGD на процессор.Код ОС и данные будут согласованы между ядрами.Каждое ядро ​​будет иметь свой собственный TLB и L1-кэш;Кэши L2 / L3 могут быть общими или нет.Обслуживание кэшей данных / кода зависит от того, являются ли они VIVT или VIPT, но это является побочной проблемой и не должно влиять на использование MMU и многоядерности.

Процесс или пользовательская часть таблиц страниц 2-го уровня остается неизменной для процесса ;в противном случае у них была бы другая память, или вам нужно было бы синхронизировать избыточные таблицы.Отдельные ядра могут иметь разные наборы таблиц страниц 2-го уровня (разные указатели таблицы страниц верхнего уровня), когда они запускают разные процессы.Если он многопоточный и работает на двух процессорах, то таблица верхнего уровня может содержать те же записи таблицы страниц 2-го уровня для процесса.Фактически, вся таблица страниц верхнего уровня может быть одинаковой (но с разной памятью), когда два ЦП выполняют один и тот же процесс.Если локальные данные потока реализованы с помощью MMU, одна запись может отличаться.Однако локальные данные потока обычно реализуются другими способами из-за проблем с TLB и кэшем (сброс / согласованность).

Изображение ниже может помочь.Записи CPU, PGD и PTE на диаграмме похожи на указатели.

Multi-cpu MMU

Пунктирная линия - единственное отличиемежду запущенными разными процессами и одними и теми же процессами (многопоточность) с MMU;это альтернатива сплошной линии, идущей от PGD CPU2 к PTE процесса B или таблице страниц 2-го уровня.Ядро всегда является многопоточным приложением ЦП.

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

Разрешение доступа к коду / данным ядра, очевидно, отличается.На самом деле, вероятно, будут другие проблемы, такие как память устройства и т. Д. Однако я думаю, что диаграмма должна прояснить, как MMU удается сохранить многопоточную память одинаковой.

Вполне возможно, чтозапись в таблице 2-го уровня может быть разной для каждого потока.Однако это может повлечь за собой затраты при переключении потоков на одном и том же ЦП, поэтому обычно отображаются данные для всех «локальных потоков» и используется какой-то другой способ выбора данных.Обычно локальные данные потока находятся через указатель или индексный регистр (особый для процессора), который отображается / указывает на данные внутри «процесса» или пользовательской памяти.«локальные данные потока» не изолированы от других потоков, поэтому, если у вас есть перезапись памяти в одном потоке, вы можете уничтожить данные других потоков.

2 голосов
/ 10 сентября 2012

Извините за предыдущий ответ.Удален ответ.

TI PandaBoard работает на процессоре OMAP4430 Dual Cortex A9.Он имеет один MMU на ядро.Он имеет 2 MMU для 2 ядер.

http://forums.arm.com/index.php?/topic/15240-omap4430-panda-board-armcortex-a9-mp-core-mmu/

Выше информация предоставляет информацию.

Кроме того, еще немного информации о ARM v7

Каждое ядро ​​имеет следующие функции:

  1. Процессор ARM v7 на частоте 600 МГц
  2. 32 КБ инструкции L1 CACHE с проверкой четности
  3. 32 КБ кэша данных L1 с проверкой четности
  4. Встроенный FPU для скалярных операций с плавающей точкой с одинарной и двойной точностью данных
  5. Блок управления памятью (MMU)
  6. Поддержка набора команд ARM, Thumb2 и Thumb2-EE
  7. Расширение безопасности TrustZone ©
  8. Программа Trace Macrocell и компонент CoreSight ©для отладки программного обеспечения
  9. интерфейс JTAG
  10. AMBA © 3 64-разрядный интерфейс AXI
  11. 32-разрядный таймер с 8-разрядным прескалером
  12. Внутренний сторожевой таймер (работает также как таймер)

Двухъядерная конфигурация завершаетсяобщий набор компонентов:

  1. Блок управления Snoop (SCU) для управления межпроцессным взаимодействием, кеш-2-кеш и передача системной памяти, когерентность кеша
  2. Универсальный модуль управления прерываниями (GIC), настроенный на поддержку 128 независимых источников прерываний с программно настраиваемым приоритетом и маршрутизацией между двумя ядрами
  3. 64-разрядный глобальный таймер с 8-разрядным прескалером
  4. Асинхронный порт когерентности ускорителя (ACP)
  5. Поддержка контроля четности для обнаружения сбоев внутренней памяти во время выполнения
  6. 512 КБ унифицированного 8-полосного ассоциативного набора L2кэш с поддержкой проверки на четность и ECC
  7. контроллер кэша L2 на основе PL310 IP, выпущенный ARM
  8. двойной 64-битный интерфейс AMBA 3 AXI с возможной фильтрацией на второмодин для использования одного порта для доступа к памяти DDR

Хотя все это для ARM, оно даст общее представление.

1 голос
/ 04 апреля 2012

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

Обратите внимание, что в наши дни TLB представляет собой сложного зверя с несколькими уровнями кэширования . Точно так же, как и обычные кэш-памяти ЦП (L1-L3), вы не обязательно ожидаете, что его состояние в любой момент времени будет содержать информацию исключительно о текущем выполняющемся процессе, но для его частичного перемещения по требованию; см. раздел Context Switch на странице википедии.

В SMP все TLB процессоров должны поддерживать согласованное представление таблицы системных страниц. См., Например, этот раздел книги о ядре Linux , чтобы узнать, как это сделать.

0 голосов
/ 15 мая 2012

По вопросу о MMU на процессор их может быть несколько. Предполагается, что каждый MMU будет добавлять дополнительную пропускную способность памяти. Если память DDR3-12800 допускает 1600 мегапередач в секунду на процессоре с одним MMU, то один с четырьмя теоретически допускает 6400. Обеспечение пропускной способности для доступных ядер, вероятно, является настоящим подвигом. Объявленная пропускная способность в процессе работы будет сведена на нет.

Количество MMU на процессоре не зависит от количества ядер на нем. Очевидными примерами являются 16-ядерные процессоры AMD, у них точно нет 16 MMU. Двухъядерный процессор, с другой стороны, может иметь два MMU. Или только один. Или три?

Редактировать

Может, я путаю MMU с каналами?

0 голосов
/ 29 марта 2012

AFAIK, существует один MMU на физический процессор, по крайней мере, в системах SMP, поэтому все ядра используют один MMU.

В системах NUMA каждое ядро ​​имеет отдельный MMU, поскольку каждое ядро ​​имеет свою собственную личную память.

...