Многопрограммная работа ЭВМ. Многомашинные и многопроцессорные вычислительные системы

Фундаментальный теоретический конспект лекции по дисциплине «Архитектура аппаратных средств» (СИЭУиП, тема 1.8, занятие 19). Архитектурные принципы многопрограммности, сильносвязанные многопроцессорные комплексы (SMP, NUMA), протоколы кэш-когерентности (MESI, MOESI), слабосвязанные многомашинные системы (кластеры Beowulf, передача сообщений MPI, интерконнекты InfiniBand и RoCE) и балансировка нагрузки.

1. Архитектурные основы многопрограммной работы ЭВМ

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

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

1.1. Процессы, потоки и переключение контекста (Context Switch)

Для реализации многопрограммности архитектура ЭВМ и операционная система разделяют вычислительную работу на две ключевые абстракции:

Аппаратный контекст и переключение контекста (Context Switch):
Когда таймер генерирует прерывание или процесс инициирует системный вызов ожидания (I/O Blocked), планировщик ОС выполняет переключение контекста:
  1. Текущее состояние регистров процессора (счетчик команд PC, указатель стека SP, регистры общего назначения, флаги EFLAGS/RFLAGS) сохраняется в системную структуру ядра (Task State Segment / Process Control Block).
  2. Переключается регистр базового адреса каталога страниц MMU (в x86 — регистр CR3), что влечет за собой аппаратную инвалидацию кэша трансляции адресов TLB (Translation Lookaside Buffer).
  3. Загружается регистровый контекст нового процесса, и управление передается по новому адресу PC.
Цена переключения контекста: прямые затраты составляют 1000–3000 тактов процессора (1–2 мкс), а косвенные (из-за промахов в "холодных" кэшах L1/L2 и TLB) могут вызывать деградацию производительности на протяжении десятков тысяч тактов.

1.2. Уровни параллелизма: ILP, DLP, TLP

Современные процессоры реализуют параллелизм на трех принципиально разных аппаратных уровнях:

2. Сильносвязанные многопроцессорные системы (SMP и NUMA)

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

2.1. Симметричные мультипроцессоры (SMP) и архитектура UMA

В классической архитектуре SMP (Symmetric Multiprocessing) все процессоры абсолютно равноправны и подключены к единой оперативной памяти через общую системную шину или кроссбар-коммутатор (Crossbar).

Эта организация называется UMA (Uniform Memory Access — однородный доступ к памяти): время обращения к любому физическому адресу ОЗУ строго одинаково для любого ядра в системе.

Ограничение масштабируемости UMA:
Общая шина памяти является неделимым разделяемым ресурсом. При увеличении числа процессоров более 4–8 шина насыщается запросами на чтение и запись (Bus Contention). Процессоры начинают проводить больше времени в арбитраже шины, чем в вычислениях. Это привело к переходу на распределенную память с неоднородным доступом — NUMA.

2.2. Архитектура ccNUMA (Non-Uniform Memory Access)

В серверах с архитектурой NUMA физическая память разделена между процессорными сокетами (или чиплетами). Каждый сокет имеет собственный встроенный контроллер памяти и локальные каналы DDR4/DDR5 (образуя локальный NUMA-узел).

При этом логически память остается единым сквозным 64-битным адресным пространством: любое ядро может прочитать или записать байт в ОЗУ любого другого сокета без участия программных сообщений.

Связь между сокетами осуществляется по высокоскоростным когерентным шинам с пакетной передачей (Intel UPI — Ultra Path Interconnect или AMD Infinity Fabric).

Фактор неоднородности (NUMA Ratio) = Latency_Remote / Latency_Local ≈ 1.3 ... 2.0
Локальный доступ: ~60–80 нс | Удаленный доступ (межсокетовый): ~120–160 нс

Если ОС или СУБД случайным образом раскидывает потоки и память по сокетам, постоянные межсокетовые транзакции приводят к падению производительности до 30–50%. Для борьбы с этим применяют привязку потоков к сокетам (CPU Pinning / numactl) и локальное выделение страниц.

3. Аппаратная кэш-когерентность: шинный снупинг и протокол MESI

Поскольку каждое процессорное ядро оснащено собственными быстрыми локальными кэшами L1 и L2, в системе возникает фундаментальная проблема: если Ядро 1 изменило значение переменной X в своем кэше L1, а Ядро 2 считывает X из своего кэша, Ядро 2 прочитает устаревшее значение (Stale Data). Нарушается целостность памяти.

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

3.1. Механизм шинного снупинга (Bus Snooping)

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

3.2. Состояния протокола MESI

Классический протокол MESI (также известный как протокол Иллинойса) присваивает каждой 64-байтной строке кэша один из 4 статусов:

Состояние Название Смысл состояния Связь с оперативной памятью
M Modified (Модифицированная) Строка присутствует только в одном данном кэше; данные изменены ядром (Dirty). Не совпадает с ОЗУ. При вытеснении обязательна обратная запись (Write-Back).
E Exclusive (Эксклюзивная) Строка присутствует только в данном кэше; значение не изменялось (Clean). Полностью совпадает с ОЗУ. Процессор может записать данные, мгновенно перейдя в M.
S Shared (Разделяемая) Строка может присутствовать в кэшах нескольких ядер одновременно для чтения. Полностью совпадает с ОЗУ. Запись запрещена без предварительной инвалидации других копий.
I Invalid (Недействительная) Строка не содержит актуальных данных (пустая или инвалидированная другим ядром). Любое обращение вызывает аппаратный кэш-промах (Cache Miss).

3.3. Ложное разделение данных (False Sharing)

Размер единицы когерентности — строка кэша (Cache Line) — составляет 64 байта. Если два потока на разных ядрах изменяют две независимые переменные (например, counter_A и counter_B), расположенные в памяти рядом (в пределах одних 64 байт):

Решение: Программное выравнивание критических структур данных на границу 64 байт с помощью директив alignas(64) (C++) или вставка дополнительного заполнителя (padding).

4. Слабосвязанные многомашинные комплексы (Кластеры)

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

4.1. Кластерная архитектура Beowulf и модель MPI

Историческая концепция Beowulf (1994 г., NASA) доказала, что суперкомпьютерную производительность можно получить объединением серийных общедоступных компьютеров (COTS — Commercial Off-The-Shelf) на базе Linux через стандартную локальную сеть.

Поскольку общей памяти нет, взаимодействие между процессами осуществляется по парадигме передачи сообщений (Message Passing). Общепринятым промышленным стандартом является библиотека MPI (Message Passing Interface):

4.2. Сетевые интерконнекты: Ethernet vs RoCE v2 vs InfiniBand

Главный барьер масштабирования кластеров — сетевая латентность (Network Latency). Если передача сообщения требует десятков микросекунд, процессоры простаивают на барьерах синхронизации.

Интерконнект Аппаратная задержка (Latency) Нагрузка на центральный процессор Область применения
Стандартный Ethernet (TCP/IP) 15–50 микросекунд (мкс) Высокая: прерывания ядра ОС, копирование буферов, софтварный стек. Офисные сети, веб-сервисы, распределенная обработка Hadoop / Spark.
RoCE v2 (RDMA over Converged Ethernet) 1.5–3.0 микросекунды (мкс) Нулевая (Zero-Copy, Kernel-Bypass): сетевая карта передает данные напрямую из памяти. Корпоративные облачные дата-центры, хранилища NVMe-oF, обучение нейросетей.
InfiniBand (HDR 200G / NDR 400G) 0.6–1.0 микросекунды (мкс) Аппаратная: управление потоком без потерь (Lossless), редукция в коммутаторах (SHARP). Суперкомпьютеры рейтинга Top500, молекулярная физика, CFD, квантовая химия.

4.3. Технология RDMA (Remote Direct Memory Access)

Технология RDMA позволяет сетевому адаптеру одного узла напрямую считывать или записывать байты в оперативную память удаленного узла без задействования операционной системы и прерываний процессора хоста. Это устраняет контекстные переключения и снижает задержку в 10–50 раз по сравнению с классическим TCP/IP сокетом.

5. Масштабируемость, балансировка нагрузки и границы параллелизма

Увеличение числа вычислительных узлов не дает пропорционального ускорения программы из-за двух фундаментальных факторов: наличия последовательного кода и накладных расходов интерконнекта.

5.1. Закон Амдала (Strong Scaling — сильное масштабирование)

Рассматривает задачу фиксированного суммарного размера. Если доля строго последовательного кода равна $s$ ($0 \le s \le 1$), а доля параллельного кода $p = 1 - s$:

Ускорение: S_A = 1 / (s + p / n)
Теоретический предел ускорения: lim (n -> inf) S_A = 1 / s

Следствие: Если в программе всего 5% последовательного кода ($s = 0.05$), даже на суперкомпьютере с миллионом процессоров ускорение никогда не превысит $1 / 0.05 = \mathbf{20}$ раз!

5.2. Закон Густафсона-Барсиса (Weak Scaling — слабое масштабирование)

Учитывает реальность высокопроизводительных вычислений: с ростом вычислительной мощности масштабируется размер решаемой задачи (увеличивается точность сетки, число моделируемых частиц):

Ускорение: S_G = s + p * n

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

5.3. Балансировка нагрузки (Load Balancing)

В кластерах и многопроцессорных системах время решения задачи ограничено самым медленным узлом (эффект "Straggler"). Различают два метода балансировки:

6. Контрольные вопросы для самопроверки

  1. В чем заключается принципиальная разница между процессами и потоками с точки зрения архитектуры разделения памяти?
  2. Почему переключение контекста процесса обходится процессору дороже, чем переключение потока? Какую роль в этом играет TLB?
  3. Каковы физические причины возникновения NUMA-фактора в многосокетных серверах?
  4. В каком состоянии находится строка кэша в протоколе MESI, если она прочитана двумя ядрами и совпадает с содержимым ОЗУ?
  5. Что произойдет в протоколе MESI, если процессор захочет выполнить запись в строку, находящуюся в состоянии Exclusive? Будет ли отправлен сигнал инвалидации на шину?
  6. Каковы физические предпосылки эффекта False Sharing и как разработчик может аппаратно предотвратить его в коде?
  7. Почему стандартный протокол TCP/IP на Gigabit Ethernet непригоден для масштабирования задач молекулярной динамики на сотни узлов?
  8. В чем заключается архитектурное преимущество интерфейса InfiniBand и технологии RDMA перед классической сетевой моделью ОС?
  9. В чем концептуальная разница между сильным масштабированием (закон Амдала) и слабым масштабированием (закон Густафсона-Барсиса)?
  10. Каким образом асинхронные неблокирующие пересылки MPI позволяют маскировать латентность межмашинного интерконнекта?