Тема
Архитектура фон Неймана
Материал проходит ревью.
Границы темы
Разбираем: простую модель компьютера, в которой программа хранится в памяти, а процессор выполняет её команду за командой.
Пока не разбираем: электронные схемы, сложные ускорения современных CPU и споры об истории создания компьютеров.
Перед чтением достаточно знать основные части компьютера из статьи «Как работает компьютер».
Результаты обучения
После статьи читатель сможет:
- объяснить, что такое хранимая программа;
- показать на схеме, где находятся команды и данные;
- проследить выполнение одной команды;
- объяснить, зачем нужен счётчик команд;
- описать простую программу как последовательность маленьких действий.
Основная модель
Ранние вычислительные машины могли требовать физического переключения проводов и переключателей для новой задачи. Идея хранимой программы изменила подход:
команды программы можно представить числами и хранить в памяти.Диаграмма
Процессор читает из памяти и команды, и данные. Команда говорит, что сделать: например, загрузить число, сложить два значения или перейти к другому месту программы.
Основные термины
| Термин | Простое определение |
|---|---|
| Хранимая программа | Команды программы находятся в памяти |
| Команда, или инструкция | Одно небольшое действие процессора |
| Память | Хранит команды и данные по адресам |
| Адрес | Номер места в памяти |
| Счётчик команд | Хранит адрес следующей команды |
| Регистр | Маленькое хранилище внутри процессора |
| ALU | Часть процессора для арифметики и логики |
Название «архитектура фон Неймана» обозначает эту учебную модель. Современный компьютер устроен сложнее, но модель помогает сделать первый шаг.
End-to-end сценарий
Пусть программа должна сложить 20 и 22. Запишем её как маленькие команды:
text
Адрес Команда
0 Загрузить 20 в регистр A
1 Загрузить 22 в регистр B
2 Сложить A и B, результат записать в C
3 Показать C
4 ОстановитьсяСчётчик команд сначала содержит 0.
Диаграмма
После каждой обычной команды счётчик переходит к следующему адресу. Команда перехода может изменить порядок. Благодаря переходам появляются условия и циклы.
Что происходит под капотом
Цикл выполнения команды
Процесс повторяет четыре шага:
Диаграмма
- Получить: прочитать команду по адресу из счётчика.
- Распознать: определить действие и нужные данные.
- Выполнить: посчитать, загрузить, сохранить или сравнить.
- Выбрать следующую: увеличить счётчик или перейти по другому адресу.
Эти шаги часто называют fetch — decode — execute. Запоминать английские слова сразу не обязательно; важен порядок.
Как появляются условия и циклы
Без переходов процессор шёл бы только сверху вниз. Условная команда может сказать:
text
Если A равно 0, перейти к адресу 10.
Иначе продолжить со следующей команды.Цикл получается, когда переход возвращает выполнение к уже пройденному адресу. Конструкции if, for и while языков программирования в итоге выражаются через сравнения и переходы.
Почему память влияет на скорость
Для вычисления процессору нужны команды и данные. Их приходится получать из памяти и возвращать обратно.
text
память → команда и данные → процессор → результат → памятьПроцессор может выполнять операции быстрее, чем далёкая память успевает поставлять данные. Поэтому современные компьютеры используют небольшую быструю кеш-память рядом с процессором. Подробно она разбирается в отдельной теме.
Где современный CPU сложнее
Современный процессор может одновременно готовить несколько команд, предсказывать переходы и менять внутренний порядок работы. Однако для первой модели программу удобно читать так, будто команды дают результат в заданном порядке.
Минимальный воспроизводимый пример
Небольшая программа показывает память с командами и счётчик:
js
const commands = [
() => console.log("Шаг 0: загрузить 20"),
() => console.log("Шаг 1: загрузить 22"),
() => console.log("Шаг 2: сложить, результат 42"),
];
let counter = 0;
while (counter < commands.length) {
const command = commands[counter];
command();
counter = counter + 1;
}Сохраните код в stored-program.mjs и запустите:
bash
node stored-program.mjsОжидаемый результат
text
Шаг 0: загрузить 20
Шаг 1: загрузить 22
Шаг 2: сложить, результат 42Массив commands играет роль памяти с программой, а counter — счётчика команд. Настоящий процессор работает не с JavaScript-функциями, а с двоично закодированными машинными инструкциями.
Как диагностировать ошибку
- ничего не выводится — проверьте, что
counterначинается с0; - цикл не заканчивается — проверьте строку
counter = counter + 1; - команда пропущена — выведите
counterперед её выполнением; nodeне найден — установите Node.js или проверьтеPATH.
Ограничения и trade-offs
Модель полезна, но она намеренно простая:
| Модель говорит | В реальном компьютере |
|---|---|
| Команды выполняются по одной | Несколько команд могут обрабатываться одновременно |
| Есть одна память | Есть регистры, несколько кешей, RAM и накопители |
| Есть один исполнитель | Может быть много ядер и процессоров |
| Ввод и вывод — отдельные блоки | Есть много устройств и контроллеров |
Упрощение не является ошибкой, если помнить его границы.
Failure modes и типичные ошибки
- Команда и строка исходного кода — одно и то же. Одна строка может превратиться во множество машинных инструкций.
- Счётчик команд всегда увеличивается на один. Переход меняет его на другой адрес.
- Данные и команды выглядят одинаково для человека. Их смысл задают формат и способ использования.
- Современный компьютер буквально состоит из пяти прямоугольников на схеме. Схема показывает роли, а не физическое устройство.
- Процессор хранит всю программу внутри себя. Основной код находится в памяти; CPU получает нужные команды.
Практическое задание
Задача: дополните пример четвёртой командой и сделайте один переход: после команды с адресом 2 сразу завершите программу.
Критерии готовности:
- без перехода выполняются четыре команды;
- с переходом последняя команда пропускается;
- перед каждым шагом выводится значение счётчика;
- вы можете объяснить, какая строка меняет обычный порядок.
Подсказка
После выполнения команды с индексом 2 присвойте counter = commands.length. Проследите, почему условие цикла после этого становится ложным.
Проверка знаний
ИНТЕРАКТИВНАЯ ПРОВЕРКА
Хранимая программа
0 / 4
01Что означает принцип хранимой программы?
02Счётчик команд хранит адрес следующей команды программы.
03Какие части входят в упрощённую модель фон Неймана?
04Восстановите цикл выполнения команды.
- Выполнить действие
- Получить команду из памяти
- Перейти к следующей команде
- Определить смысл команды
Самопроверка
- Что хранится в памяти вместе с данными?
- Зачем нужен счётчик команд?
- Из каких четырёх шагов состоит цикл выполнения?
- Как появляется цикл в программе?
Ответы и критерии
- Команды программы.
- Он указывает адрес следующей команды.
- Получить, распознать, выполнить, выбрать следующую команду.
- Команда перехода возвращает счётчик к ранее выполненному адресу.
Краткое резюме
- Команды программы можно хранить в памяти вместе с данными.
- У каждой ячейки памяти есть адрес.
- Счётчик команд указывает, какую команду получить следующей.
- Процессор повторяет цикл: получить, распознать, выполнить, продолжить.
- Условия и циклы строятся с помощью переходов.
Следующие шаги
Теперь можно подробнее разобрать процессор: ядра, частоту, регистры, кеш и причины разной скорости выполнения.
Источники
- John von Neumann, First Draft of a Report on the EDVAC — первичный исторический документ о памяти, управляющем, арифметическом и вводно-выводных органах машины.
- RISC-V Unprivileged ISA Specification — современный открытый пример машинных инструкций, регистров и переходов.
- Arm: Introducing the Arm architecture — официальное введение в архитектуру процессора и её связь с реализацией.