Введение

Архитектура компьютера, в которой код и данные используют общую шину.

Архитектура фон Неймана, также известная как модель фон Неймана или архитектура Принстона, – это компьютерная архитектура, основанная на описании, сделанном Джоном фон Нейманом и другими в 1945 году в первом проекте отчета об EDVAC. Термин «архитектура фон Неймана» со временем стал применяться к любому компьютеру с хранимой программой, в котором выборка инструкции и операция с данными не могут происходить одновременно (поскольку они используют общую шину). Это явление известно как «узкое место фон Неймана», которое часто ограничивает производительность соответствующей системы. Архитектура фон Неймана проще, чем архитектура Гарварда (которая имеет один набор адресных и шин данных для чтения и записи в память и другой набор адресных и шин данных для выборки инструкций). Компьютер с хранимой программой использует один и тот же базовый механизм для кодирования как программных инструкций, так и данных, в отличие от конструкций, использующих механизм, такой как дискретное подключение панелей или фиксированная схема управления для реализации инструкций. Компьютеры с хранимой программой стали усовершенствованием по сравнению с компьютерами 1940-х годов, которые требовали ручной переконфигурации или имели фиксированные функции, например, Colossus и ENIAC. Эти компьютеры программировались путем установки переключателей и подключения патч-кордов для маршрутизации данных и сигналов управления между различными функциональными блоками. Подавляющее большинство современных компьютеров используют один и тот же аппаратный механизм для кодирования и хранения как данных, так и программных инструкций, но имеют кэш-память между ЦП и оперативной памятью, а для кэшей, ближайших к ЦП, – отдельные кэши для инструкций и данных, так что большинство выборок инструкций и данных используют отдельные шины (архитектура с разделенным кэшем).

История

Самые ранние вычислительные машины имели фиксированные программы. Некоторые очень простые компьютеры до сих пор используют эту конструкцию, либо из-за простоты, либо в учебных целях. Например, настольный калькулятор (по сути) является компьютером с фиксированной программой. Он может выполнять базовые математические операции, но не способен запускать текстовые редакторы или игры. Изменение программы машины с фиксированной программой требует перекоммутации, реструктуризации или перепроектирования. Самые ранние компьютеры скорее "проектировались", чем "программировались" для конкретной задачи. "Перепрограммирование" – когда оно вообще было возможно – представляло собой трудоемкий процесс, начинавшийся с блок-схем и записей на бумаге, за которым следовали детальные инженерные чертежи, а затем часто сложный процесс физической перекоммутации и перестройки машины. Настройка и отладка программы на ENIAC могли занимать до трех недель. С появлением компьютеров с хранимой программой ситуация изменилась. Компьютер с хранимой программой по своей конструкции включает в себя набор инструкций и может хранить в памяти набор инструкций (программу), определяющий порядок вычислений. Архитектура с хранимой программой также допускает самомодифицирующийся код. Одной из ранних причин для реализации такой возможности была потребность в программе для увеличения или изменения адресной части инструкций, что операторам приходилось делать вручную в ранних конструкциях. Эта необходимость уменьшилась, когда индексные регистры и косвенная адресация стали стандартными элементами машинной архитектуры. Другим применением было встраивание часто используемых данных в поток инструкций с помощью непосредственной адресации.

Способность

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

Первые компьютеры с сохраненной программой

Данные о датах в следующей хронологии сложно привести в порядок. Некоторые даты относятся к первому запуску тестовой программы, некоторые – к первой демонстрации или завершению компьютера, а некоторые – к первой поставке или установке. IBM SSEC обладал возможностью обрабатывать инструкции как данные и был публично продемонстрирован 27 января 1948 года. Эта возможность была запатентована в США. Однако он был частично электромеханическим, а не полностью электронным. На практике инструкции считывались с бумажной ленты из-за ограниченной памяти. ARC2, разработанный Эндрю Бутом и Кэтлин Бутом в Биркбеке, Лондонский университет, официально начал работу 12 мая 1948 года. Manchester Baby был первым полностью электронным компьютером, способным выполнять хранимую программу. 21 июня 1948 года он выполнил программу факторизации в течение 52 минут, после выполнения простой программы деления и программы, демонстрирующей взаимную простоту двух чисел. ENIAC был модифицирован для работы в качестве примитивного компьютера с программой только для чтения (используя таблицы функций в качестве ПЗУ для программ) и был продемонстрирован в таком виде 16 сентября 1948 года, выполняя программу Адель Голдстайн для фон Неймана. BINAC выполнял некоторые тестовые программы в феврале, марте и апреле 1949 года, но был завершен только в сентябре 1949 года. Manchester Mark 1 был разработан на основе проекта Baby. Промежуточная версия Mark 1 была доступна для запуска программ в апреле 1949 года, но была завершена только в октябре 1949 года. EDSAC выполнил свою первую программу 6 мая 1949 года. EDVAC был поставлен в августе 1949 года, но имел проблемы, которые не позволили ввести его в регулярную эксплуатацию до 1951 года. CSIR Mk I выполнил свою первую программу в ноябре 1949 года. SEAC был продемонстрирован в апреле 1950 года. Pilot ACE выполнил свою первую программу 10 мая 1950 года, а демонстрация состоялась в декабре 1950 года. SWAC был завершен в июле 1950 года. Whirlwind был завершен в декабре 1950 года и начал фактическое использование в апреле 1951 года. Первый ERA Atlas (позже коммерческий ERA 1101/UNIVAC 1101) был установлен в декабре 1950 года.

Эволюция

В течение десятилетий 1960-х и 1970-х годов компьютеры, как правило, становились меньше и быстрее, что привело к эволюции их архитектуры. Например, ввод-вывод, отображённый в память, позволяет рассматривать входные и выходные устройства как память. Единая системная шина могла использоваться для создания модульной системы с более низкой стоимостью. Это иногда называют "упрощением" архитектуры. В последующие десятилетия простые микроконтроллеры иногда отказывались от некоторых функций для снижения стоимости и размера. Более мощные компьютеры добавляли функции для повышения производительности.

Глотка фон Неймана

Общая шина между программной памятью и памятью данных приводит к "узкому месту фон Неймана" – ограниченной пропускной способности (скорости передачи данных) между центральным процессором (CPU) и памятью по сравнению с объемом памяти. Поскольку единственная шина может одновременно обращаться только к одному из двух типов памяти, пропускная способность оказывается ниже скорости, с которой CPU способен работать. Это серьезно ограничивает эффективную скорость обработки, когда CPU необходимо выполнять даже небольшие операции над большими объемами данных. CPU постоянно вынужден ждать, пока необходимые данные будут перемещены в память или из нее. Поскольку скорость CPU и объем памяти растут значительно быстрее, чем пропускная способность между ними, это "узкое место" становится все более актуальной проблемой, и ее острота возрастает с каждым новым поколением процессоров. "Узкое место фон Неймана" было описано Джоном Бэкусом в его лекции при вручении премии ACM Тьюринга в 1977 году. По словам Бэкуса:

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

Самомодифицирующийся код

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