Skip to content

Архитектура фон Неймана

Материал проходит ревью.

НовичокФундамент ~22 мин

Границы темы

Разбираем: простую модель компьютера, в которой программа хранится в памяти, а процессор выполняет её команду за командой.

Пока не разбираем: электронные схемы, сложные ускорения современных CPU и споры об истории создания компьютеров.

Перед чтением достаточно знать основные части компьютера из статьи «Как работает компьютер».

Результаты обучения

После статьи читатель сможет:

  1. объяснить, что такое хранимая программа;
  2. показать на схеме, где находятся команды и данные;
  3. проследить выполнение одной команды;
  4. объяснить, зачем нужен счётчик команд;
  5. описать простую программу как последовательность маленьких действий.

Основная модель

Ранние вычислительные машины могли требовать физического переключения проводов и переключателей для новой задачи. Идея хранимой программы изменила подход:

команды программы можно представить числами и хранить в памяти.
Диаграмма

Процессор читает из памяти и команды, и данные. Команда говорит, что сделать: например, загрузить число, сложить два значения или перейти к другому месту программы.

Основные термины

ТерминПростое определение
Хранимая программаКоманды программы находятся в памяти
Команда, или инструкцияОдно небольшое действие процессора
ПамятьХранит команды и данные по адресам
АдресНомер места в памяти
Счётчик командХранит адрес следующей команды
РегистрМаленькое хранилище внутри процессора
ALUЧасть процессора для арифметики и логики

Название «архитектура фон Неймана» обозначает эту учебную модель. Современный компьютер устроен сложнее, но модель помогает сделать первый шаг.

End-to-end сценарий

Пусть программа должна сложить 20 и 22. Запишем её как маленькие команды:

text
Адрес  Команда
0      Загрузить 20 в регистр A
1      Загрузить 22 в регистр B
2      Сложить A и B, результат записать в C
3      Показать C
4      Остановиться

Счётчик команд сначала содержит 0.

Диаграмма

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

Что происходит под капотом

Цикл выполнения команды

Процесс повторяет четыре шага:

Диаграмма
  1. Получить: прочитать команду по адресу из счётчика.
  2. Распознать: определить действие и нужные данные.
  3. Выполнить: посчитать, загрузить, сохранить или сравнить.
  4. Выбрать следующую: увеличить счётчик или перейти по другому адресу.

Эти шаги часто называют 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Восстановите цикл выполнения команды.
  1. Выполнить действие
  2. Получить команду из памяти
  3. Перейти к следующей команде
  4. Определить смысл команды
Проверено: 0 из 4

Самопроверка

  1. Что хранится в памяти вместе с данными?
  2. Зачем нужен счётчик команд?
  3. Из каких четырёх шагов состоит цикл выполнения?
  4. Как появляется цикл в программе?
Ответы и критерии
  1. Команды программы.
  2. Он указывает адрес следующей команды.
  3. Получить, распознать, выполнить, выбрать следующую команду.
  4. Команда перехода возвращает счётчик к ранее выполненному адресу.

Краткое резюме

  • Команды программы можно хранить в памяти вместе с данными.
  • У каждой ячейки памяти есть адрес.
  • Счётчик команд указывает, какую команду получить следующей.
  • Процессор повторяет цикл: получить, распознать, выполнить, продолжить.
  • Условия и циклы строятся с помощью переходов.

Следующие шаги

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

Источники