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

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

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

Рис. 1. Структура типового многоядерного процессора

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

Режимы многопроцессорной обработки и ОСРВ

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

  • асимметричная многопроцессорная обработка (Asymmetric multiprocessing, AMP) - отдельная ОС или индивидуальный образ одной ОС работает на каждом ядре процессора;
  • симметричная многопроцессорная обработка - единый образ ОС одновременно управляет всеми ядрами процессора, и приложения могут использовать любое ядро;
  • исключительная многопроцессорная обработка - единый образ ОС одновременно управляет всеми ядрами процессора, но каждое приложение закреплено за конкретным ядром.

Асимметричная многопроцессорная обработка

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

Асимметричная многопроцессорная обработка может быть либо однородной — на каждом ядре исполняется операционная система одного типа и версии, либо разнородной — ядра работают под управлением различных ОС или разных версий одной ОС. В однородной среде исполнения разработчики могут использовать несколько ядер путем выбора ОС, которая поддерживает распределенную программную модель, например QNX Neutrino. Установленная на целевую систему, данная модель позволяет исполняемым в одном ядре приложениям прозрачно взаимодействовать с другими приложениями и системными службами (к примеру, с драйверами устройств и наборами протоколов) других ядер, однако без значительной загрузки центрального процессора, свойственной традиционным формам межзадачного взаимодействия.

Разнородная среда исполнения предъявляет несколько иные требования. В этом случае разработчик должен либо реализовать собственную схему взаимодействия, либо выбрать две ОС, которые имеют общую инфраструктуру (вероятно, основанную на протоколе IP) для межпроцессорного взаимодействия. Для того чтобы избежать конфликтов ресурсов, такие ОС также должны предусматривать стандартизированные механизмы для доступа к разделяемым аппаратным компонентам.

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

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

Рис. 2. Использование разнородной асимметричной многопроцессорной обработки (AMP) для режимов работы панели управления и информационной панели

В приведенном примере использования разнородной среды исполнения (рис. 2) одно ядро реализует панель управления, в то время как другое обрабатывает весь трафик, поступающий с информационной панели, что означает обеспечение производительности в реальном времени. В данном случае обе операционные системы, исполняемые на двух ядрах, должны поддерживать последовательный механизм межзадачного взаимодействия, к примеру обладающий свойством «прозрачности» протокол межзадачного взаимодействия (Transparent Inter-Process Communication Protocol). Протокол позволяет ядрам обмениваться данными путем возможного использования разделяемых структур и является стандартом при обеспечении взаимодействия между разнородными операционными системами в сетевой среде. В сравнении с TCP/IP данный протокол обладает более высокой скоростью и эффективностью, исключает потерю сообщений и поддерживает еще целый ряд возможностей, применяемых в сетевых устройствах следующего поколения.

Фактически во всех случаях поддержка операционной системой основополагающих и удобных для использования протоколов обмена данными может улучшить межъядерное взаимодействие. В частности, построенная с учетом парадигмы распределенного программирования ОС может использовать преимущества параллелизма, который обеспечивается несколькими ядрами. Наиболее типовыми ОС, поддерживающими AMP, являются системы жесткого реального времени, такие как VxWorks, OSE и QNX, однако в настоящий момент и отдельные реализации Linux, адаптированные под реальное время, имеют данную функциональность.

Распределение ресурсов

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

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

Симметричная многопроцессорная обработка

Распределение ресурсов в многоядерной архитектуре может быть затруднительным, особенно когда множество программных компонентов не располагают информацией о том, каким образом другие компоненты используют эти ресурсы. Симметричная многопроцессорность (Symmetric multiprocessing, SMP) предлагает исполнение только одной ОС во всех ядрах системы. Так как ОС имеет возможность влиять на работу всех системных элементов в любой момент времени, она может распределять ресурсы между несколькими ядрами с минимальным вмешательством разработчика приложений или совсем без его участия. Более того, ОС может поддерживать встроенные стандартизированные операции, которые позволяют нескольким приложениям безопасно и просто разделять ресурсы. Симметричная многопроцессорная обработка применяется обычно в настольных и серверных операционных системах.

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

Должным образом реализованная ОС с поддержкой симметричной многопроцессорности обеспечивает данные преимущества, не заставляя разработчика использовать специализированные программные интерфейсы приложений или языки программирования. Уже давно разработчики использовали программный интерфейс приложения pthreads из стандарта POSIX в системах с симметричной многопроцессорностью высокого класса. Стандарт POSIX позволяет разработчикам писать код, который может быть использован как в однопроцессорных, так и многоядерных системах. В действительности, некоторые ОС (такие, как Linux, Solaris, QNX) позволяют применять один и тот же исходный код при исполнении на любом из типов процессоров.

Хорошо спроектированные ОС с симметричной многопроцессорностью, такие как Windows, Solaris, QNX Neutrino, позволяют потокам управления в пределах приложения исполняться одновременно на любом ядре. Такой параллелизм в любой момент времени предоставляет приложениям полную вычислительную мощность процессора. Если ОС дает соответствующие возможности по приоритетному прерыванию обслуживания и назначению приоритетов потокам управления, то это может помочь разработчику приложений обеспечить выделение процессорных циклов тем приложениям, которым это наиболее необходимо.

В сценарии панели управления, представленном на рис. 3, симметричная многопроцессорность позволяет всем потокам управления, принадлежащим разным процессам, выполняться на любом ядре. К примеру, процесс интерфейса командной строки (Command-Line Interface, CLI) может выполняться в то время, как приложение трассировки осуществляет интенсивные вычисления.

Рис. 3. Использование симметричной многопроцессорной обработки в панели управления

Исключительная многопроцессорность

Исключительная многопроцессорность (Bound Multiprocessing, BMP) — новый режим, предложенный компанией QNX Software Systems, сохраняющий преимущества прозрачного администратора ресурсов симметричной многопроцессорной обработки и дающий разработчикам возможность привязывать программные задачи к конкретным ядрам. Как и в случае симметричной многопроцессорности, одна копия ОС сохраняет полное представление обо всех системных ресурсах, позволяя динамически распределять и разделять их между приложениями. Однако во время инициализации приложений определяемая системным разработчиком установка может заставить все потоки управления приложения выполняться только на заданном ядре.

По сравнению с полноценным «плавающим» режимом симметричной многопроцессорности, такой подход обеспечивает несколько преимуществ. Он устраняет переполнение кэш-памяти, которое может ухудшить производительность систем с симметричной многопроцессорностью, позволяя приложениям, разделяющим один и тот же набор данных, выполняться исключительно на одном ядре. Также он предлагает более быструю по сравнению с симметричной многопроцессорностью отладку приложений, поскольку все выполняемые в рамках одного приложения потоки управления запускаются на одном ядре. Наконец, он помогает унаследованным приложениям, разработанным для однопроцессорных систем, корректно выполняться, позволяя запускать их на одном ядре.

При использовании исключительной многопроцессорности приложение, закрепленное за одним ядром, не может задействовать другие ядра, даже если они простаивают. Разработчик ОС может предложить инструменты для анализа степени использования ресурсов (включая загрузку процессора) для каждого из приложений и рекомендации по лучшему способу распределения приложений по ядрам в целях достижения максимальной производительности. Если ОС также позволяет динамически изменять назначенное процессорное ядро при помощи добавочного микропроцессора, то пользователь получает возможность динамически переключаться с одного ядра на другое без дополнительного введения контрольных точек и остановки/перезапуска приложения.

Рис. 4. Использование исключительной многопроцессорности в полудуплексном режиме

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

В примере, показанном на рис. 5, приложения панели управления (интерфейс командной строки; эксплуатация, администрирование и техническое обслуживание; управление информационной панелью) выполняются на ядре 0, в то время как входные и выходные приложения информационной панели работают совместно на ядре 1. Разработчики могут реализовать механизм межзадачного взаимодействия (IPC) для этого сценария, используя локальные механизмы ОС или синхронизированные защищенные структуры разделяемой памяти.

Рис.5. Использование исключительной многопроцессорной обработки (BMP) для режимов работы панели управления и информационной панели

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

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

Вопрос выбора

Должен ли разработчик выбрать асимметричную, симметричную или исключительную многопроцессорность?

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

Андрей Николаев (a.nikolaev@swd.ru) — директор по развитию компании SWD Software (Cанкт-Петербург).