flowchart LR
A["Какую программу<br/>написать?"]:::old
B["На какой машине<br/>она исполняется?"]:::new
A -.-> B
classDef old fill:#eee,stroke:#999
classDef new fill:#dbeafe,stroke:#1d4ed8
Архитектура аппаратных средств — из каких частей состоит машина, что видно программе, как устроено внутри, как машины классифицируют.
Цель и задачи (шпаргалка)
#
Задача лекции
1
Уровни абстракции вычислительной системы
2
Архитектура (ISA) ≠ микроархитектура ≠ вентили
3
Принципы фон Неймана + цикл команды
4
Гарвард и почему у PC два кэша, но одна память
5
Фасеты классификации (Флинн, RISC/CISC, класс машины)
После пары: про любое устройство — ISA, фон Нейман/Гарвард на каком уровне, класс.
Зачем это не только схемотехнику
mindmap
root((Зачем архитектура))
Скорость
кэш
CPI
узкое место памяти
Совместимость
одна ISA
разные µarch
Встроенные системы
не маленький ПК
Flash ≠ SRAM
Выбор железа
сервер
АРМ
ПЛК / MCU
Безопасность
Spectre
W^X / NX
Три смысла слова «архитектура»
Смысл
Что имеется в виду
Пример
1. Вид для программиста (Amdahl, Blaauw, Brooks, 1964)
команды, регистры, адреса, прерывания
почти = ISA
2. Организация системы
CPU + память + ввод-вывод + связи
computer organization
3. Уровень в стеке
слой между ОС и цифровой логикой
«архитектурный уровень»
На этой лекции «архитектура» без уточнения = смысл 1 (ISA), «организация» = смысл 2.
flowchart TB
ISA["ISA<br/>контракт с программой"]
UA["Микроархитектура µarch<br/>конвейер, кэш, OoO"]
CIR["Схемотехника<br/>вентили, техпроцесс"]
ISA --> UA --> CIR
Слой
Видно программе?
Можно менять, не ломая бинарник?
ISA
да
нет (другой код)
µarch
нет для корректности
да
вентили
нет
да (другой чип той же µarch)
Одна ISA — много микроархитектур
flowchart TB
ISA["ISA: x86-64"]
ISA --> I1["Intel Skylake"]
ISA --> I2["Intel Golden Cove"]
ISA --> A1["AMD Zen 3"]
ISA --> A2["AMD Zen 4"]
ISA --> R["Rosetta 2 на Apple Silicon<br/>трансляция"]
Наш курс: уровни 4, 3 и организация «процессор — память — ввод-вывод».
Кто на каком уровне «программирует»
Уровень
Что видно
Кто работает
Прикладной
языки, API
прикладной разработчик
ОС
процессы, файлы
системный программист
ISA
команды, регистры
компилятор, ассемблер
µarch
конвейер, кэши
архитектор процессора
Логика
вентили, триггеры
логический проектировщик
Физика
транзисторы
технолог
Пять вопросов курса
flowchart LR
Q1["1. Как видит<br/>программа?"]
Q2["2. Как внутри?"]
Q3["3. Как связаны<br/>части?"]
Q4["4. Какие есть<br/>альтернативы?"]
Q5["5. Как<br/>сравнивать?"]
#
Короткий ответ сегодня
1
ISA, модель памяти
2
микроархитектура
3
шины, DMA, SoC
4
фон Нейман / Гарвард, RISC / CISC
5
фасеты + формула времени
Формула времени выполнения
T \;=\; N_{\text{команд}} \;\times\; \text{CPI} \;\times\; t_{\text{такта}}
Символ
Кто определяет
Не путать с
(N) число команд
алгоритм + ISA + компилятор
«объём программы в МБ»
CPI тактов на команду
микроархитектура + кэш + ветвления
«архитектура Intel»
(t) длительность такта
частота, техпроцесс, µarch
единственная метрика
Частота ↑ не значит программа быстрее.
Упёрлись в память → узкое место фон Неймана.
Что входит в ISA (паспорт)
mindmap
root((ISA))
Типы данных
int / float / SIMD
Регистры
число и ширина
флаги
Адресация
регистровая
косвенная
PC-relative
Команды
формат и кодирование
арифметика
load/store
переходы
Система
прерывания
привилегии
модель памяти
Примеры ISA
ISA
Семейство
Где встретите
IA-32 / x86-64
CISC
PC, серверы
AArch64 (ARMv8-A)
RISC
смартфоны, Apple, серверы
RISC-V RV64I
RISC
учебные SoC, открытое железо
IBM System/360
CISC
мейнфреймы, история совместимости
AVR, PIC16
RISC / гарвард
микроконтроллеры
Thumb-2 (Cortex-M)
RISC
STM32, встраиваемые
Бинарник Linux x86-64 ≠ «голый» ARMv8. Это другая архитектура, не «другая микросхема».
Что прячется в микроархитектуре
Механизм
Зачем
Конвейер, число стадий
совмещать шаги цикла команды
In-order / out-of-order
не ждать длинную команду
Суперскаляр
несколько команд за такт
SMT / Hyper-Threading
два потока на ядро
Кэши L1I / L1D / L2 / L3
прятать задержку памяти
Предсказатель переходов
не останавливать конвейер
Микрокод CISC
сложная команда → простые µop
DVFS
частота и напряжение «на лету»
Правило Хеннесси–Паттерсона: внутри любой порядок, наружу — семантика ISA.
ISA vs микроархитектура: таблица-гвоздь
Вопрос
ISA
Микроархитектура
Видно в учебнике ассемблера?
да
нет
Ломает старые программы при смене?
да
нет
Влияет на CPI и тепло?
слабо / косвенно
да
Влияет на Spectre?
почти нет
да
Пример имени
x86-64
Zen 4
Нельзя говорить: «у меня архитектура Skylake».
Skylake — это µarch. Архитектура — x86-64.
Фон Нейман, 1945
Источник:First Draft of a Report on the EDVAC
(идеи Эккерта, Мокли и группы Муровской школы)
flowchart LR
CA["CA<br/>арифметика<br/>ALU"]
CC["CC<br/>управление<br/>CU"]
M["M<br/>память"]
IO["I / O<br/>ввод-вывод"]
R["R<br/>внешний<br/>носитель"]
CC --- CA
CC --- M
CC --- IO
M --- R
Скачок: программа хранится в памяти, как данные
(stored-program computer, «принстонская» архитектура).
Пять принципов — учебная реконструкция
ВFirst Draft нет пронумерованных «заповедей».
Список — дидактика российских учебников.
№
Принцип
По-английски
Суть
1
Двоичное кодирование
binary representation
команды и данные — двоичные слова
2
Программное управление
stored-program
поведение задаёт программа, не проводка
3
Однородность памяти
unified memory
код и данные в одном пространстве
4
Адресность
addressable cells
ячейки пронумерованы
5
Последовательность + переходы
sequential + control flow
PC++, пока нет jump
Принцип 3 — водораздел с Гарвардом.
Схема машины фон Неймана
flowchart TB
I["Ввод I"] --> CU
subgraph CPU["Процессор"]
CU["УУ · CU<br/>счётчик команд PC"]
ALU["АЛУ · ALU"]
REG["Регистры"]
CU --- ALU --- REG
end
CU <--> MEM["Память M<br/>команды И данные<br/>одно пространство"]
CU --> O["Вывод O"]
Одна память · один тракт · смысл ячейки = как к ней обратились
Что лежит в памяти
Адрес Содержимое Как интерпретировать
─────────────────────────────────────────────
0x100 83 C1 05 команда ADD CX, 5
0x103 00 2A данное 42
0x105 E3 00 команда JCXZ …
Обращение
Ячейка 0x103
как к команде
процессор пытается декодировать 00 2A
как к данному
число 42
Однородность памяти = загрузчик, компилятор, вирус, JIT.
Цикл команды
stateDiagram-v2
[*] --> Fetch
Fetch --> Decode: команда из памяти по PC<br/>PC ← PC+длина
Decode --> Execute: код операции, регистры
Execute --> Memory: адрес / АЛУ
Memory --> Writeback: чтение/запись данного
Writeback --> Fetch: результат в регистр
Шаг
Имя
Что делает
1
Fetch
выборка команды
2
Decode
декодирование
3
Execute
операция / адрес
4
Memory
данное из той же памяти
5
Write-back
запись результата
На шагах 1 и 4 конфликт одного тракта.
Численный пример: ADD R1, [100]
Условия учебной машины: шина 16 бит · АЛУ = 1 такт · память = 3 такта · декод = 1 такт
Шаг
Действие
Такты
Кто работает
Fetch
прочитать команду
3
память
Decode
это ADD, нужен [100]
1
УУ
Memory
прочитать ячейку 100
3
память снова
Execute
сложить
1
АЛУ
Write-back
в R1
1
регистры
Итого
~9
из них 6 — память
Fetch следующей команды НЕЛЬЗЯ совместить с Memory текущей:
один порт к одной памяти.
Тот же пример: фон Нейман vs Гарвард
gantt
title Занятость тракта памяти (учебные такты)
dateFormat X
axisFormat %s
section Фон Нейман
Fetch команды :a1, 0, 3
Memory данного :a2, 4, 3
section Гарвард
Fetch команды :b1, 0, 3
Memory данного :b2, 0, 3
Организация
Fetch ∥ чтение данного
Итог для ADD
Фон Нейман
нет
~9 тактов
Гарвард (два порта)
да
память перекрыта, АЛУ не ждёт выборку
Модиф. Гарвард (оба в L1)
да
как Гарвард
Модиф. Гарвард (промах в DRAM)
нет
снова фон Нейман
Узкое место фон Неймана (Backus, 1977)
flowchart LR
CPU["Процессор<br/>быстрый АЛУ"]
BOT["УЗКОЕ МЕСТО<br/>одна шина<br/>команды + данные"]
MEM["Память<br/>большая и медленная"]
CPU <--> BOT <--> MEM
Как маскируют, не меняя модель программиста
Слой
Кэш, часто раздельный L1I / L1D
шаг к Гарварду
Иерархия L1–L2–L3–RAM–диск
организация памяти
Prefetch, предвыборка команд
µarch
Конвейер, суперскаляр
µarch
Несколько контроллеров памяти, много ядер
система
GPU / NPU «у данных»
другая организация
Миф и норма
Миф
Норма
«Есть конвейер — уже не фон Нейман»
конвейер = µarch
«Два кэша — чистый Гарвард»
это модифицированный Гарвард
«Современный CPU не фоннеймановский»
по ISA — почти всегда да
Смотрите на МОДЕЛЬ ПАМЯТИ программиста,
а не на фотографию кристалла.
Гарвардская архитектура
Имя: Harvard Mark I (Эйкен, IBM, 1940-е)
Программа — на ленте, данные — на других носителях.
flowchart TB
CU["УУ + АЛУ"]
IM["Память КОМАНД<br/>шина команд"]
DM["Память ДАННЫХ<br/>шина данных"]
CU <--> IM
CU <--> DM