Архитектура фон Неймана — также известная как модель фон Неймана или архитектура Принстона — это компьютерная архитектура , основанная на Первом черновике отчета по EDVAC [1] , написанном Джоном фон Нейманом в 1945 году, описывающем проекты, обсуждавшиеся с Джоном Мочли , Дж. Преспером Экертом в Школе электротехники Мура Пенсильванского университета . В документе описывается архитектура проекта электронного цифрового компьютера со следующими компонентами:
Приписывание изобретения архитектуры фон Нейману является спорным, не в последнюю очередь потому, что Эккерт и Мокли выполнили большую часть необходимой проектной работы и утверждают, что у них возникла идея хранить программы задолго до обсуждения этих идей с фон Нейманом и Германом Голдстайном [3]
Термин «архитектура фон Неймана» развился для обозначения любого компьютера с хранимой программой , в котором выборка инструкций и операция с данными не могут происходить одновременно (поскольку они используют общую шину ). Это называется узким местом фон Неймана, которое часто ограничивает производительность соответствующей системы. [4]
Архитектура фон Неймана проще, чем архитектура Гарварда (которая имеет один выделенный набор шин адреса и данных для чтения и записи в память, а также другой набор шин адреса и данных для выборки инструкций ).
Компьютер с хранимой программой использует тот же базовый механизм для кодирования как программных инструкций , так и данных, в отличие от конструкций, которые используют такой механизм, как дискретная коммутационная панель или фиксированная схема управления для реализации инструкций . Компьютеры с хранимой программой были шагом вперед по сравнению с вручную перенастраиваемыми или фиксированными по функциям компьютерами 1940-х годов, такими как Colossus и ENIAC . Они программировались путем установки переключателей и вставки соединительных кабелей для маршрутизации данных и сигналов управления между различными функциональными блоками.
Подавляющее большинство современных компьютеров используют один и тот же аппаратный механизм для кодирования и хранения как данных, так и программных инструкций, но имеют кэши между ЦП и памятью, а для кэшей, расположенных ближе всего к ЦП, имеют отдельные кэши для инструкций и данных, так что большинство выборок инструкций и данных используют отдельные шины ( архитектура с разделенным кэшем ).
Самые ранние вычислительные машины имели фиксированные программы. Некоторые очень простые компьютеры все еще используют эту конструкцию, либо для простоты, либо в целях обучения. Например, настольный калькулятор (в принципе) является компьютером с фиксированной программой. Он может выполнять базовые математические операции , но не может запускать текстовый процессор или игры. Изменение программы машины с фиксированной программой требует перемонтажа, реструктуризации или перепроектирования машины. Самые ранние компьютеры были не столько «запрограммированы», сколько «спроектированы» для определенной задачи. «Перепрограммирование» — когда это вообще было возможно — было трудоемким процессом, который начинался с блок-схем и бумажных заметок, за которыми следовали подробные инженерные проекты, а затем часто трудоемкий процесс физического перемонтажа и перестройки машины. Настройка и отладка программы на ENIAC могла занять три недели . [5]
С появлением компьютера с хранимой программой ситуация изменилась. Компьютер с хранимой программой по своей конструкции включает набор инструкций и может хранить в памяти набор инструкций ( программу ), которые детализируют вычисления .
Хранимая программа также допускает самомодифицирующийся код . Одной из ранних мотиваций для такой возможности была потребность в программе для увеличения или иного изменения адресной части инструкций, что операторы должны были делать вручную в ранних разработках. Это стало менее важным, когда индексные регистры и косвенная адресация стали обычными функциями архитектуры машины. Другим применением было встраивание часто используемых данных в поток инструкций с использованием немедленной адресации .
В больших масштабах способность рассматривать инструкции как данные — это то, что делает возможными ассемблеры , компиляторы , компоновщики , загрузчики и другие автоматизированные инструменты программирования. Это делает возможными «программы, которые пишут программы». [6] Это привело к расцвету сложной самохостинговой вычислительной экосистемы вокруг машин с архитектурой фон Неймана.
Некоторые языки высокого уровня используют архитектуру фон Неймана, предоставляя абстрактный, независимый от машины способ манипулирования исполняемым кодом во время выполнения (например, LISP ) или используя информацию во время выполнения для настройки оперативной компиляции (например, языки, размещенные на виртуальной машине Java , или языки, встроенные в веб-браузеры ).
В меньшем масштабе некоторые повторяющиеся операции, такие как BITBLT или пиксельные и вершинные шейдеры, могут быть ускорены на процессорах общего назначения с помощью методов компиляции JIT. Это одно из применений самомодифицирующегося кода, которое осталось популярным.
Математик Алан Тьюринг , которого натолкнули на проблему математической логики лекции Макса Ньюмена в Кембриджском университете , написал в 1936 году статью под названием « О вычислимых числах с приложением к проблеме Entscheidungsproblem» , которая была опубликована в Трудах Лондонского математического общества . [7] В ней он описал гипотетическую машину, которую он назвал универсальной вычислительной машиной , теперь известную как « Универсальная машина Тьюринга ». Гипотетическая машина имела бесконечный магазин (память в сегодняшней терминологии), который содержал как инструкции, так и данные. Джон фон Нейман познакомился с Тьюрингом, когда он был приглашенным профессором в Кембридже в 1935 году, а также во время года обучения Тьюринга в докторантуре Института перспективных исследований в Принстоне, штат Нью-Джерси, в 1936–1937 годах. Неясно, знал ли он в то время о статье Тьюринга 1936 года.
В 1936 году Конрад Цузе в двух патентных заявках также предположил, что машинные инструкции могут храниться в том же хранилище, что и данные. [8]
Независимо друг от друга, Дж. Преспер Эккерт и Джон Мокли , которые разрабатывали ENIAC в Школе электротехники Мура Пенсильванского университета , написали о концепции хранимой программы в декабре 1943 года. [9] [10] Планируя новую машину, EDVAC , Эккерт в январе 1944 года писал, что они будут хранить данные и программы в новом адресуемом запоминающем устройстве, памяти с линией задержки на ртутном металле . Это был первый раз, когда было предложено создание практической машины с хранимой программой. В то время он и Мокли не знали о работе Тьюринга.
Фон Нейман был вовлечен в Манхэттенский проект в Лос-Аламосской национальной лаборатории . Он требовал огромного количества вычислений, и поэтому летом 1944 года привлек его к проекту ENIAC. Там он присоединился к продолжающимся обсуждениям по проекту этого компьютера с хранимой программой, EDVAC. В составе этой группы он написал описание под названием « Первый черновик отчета об EDVAC» [1], основанное на работе Эккерта и Мокли. Оно было незаконченным, когда его коллега Герман Голдстайн распространил его, и в нем было указано только имя фон Неймана (к ужасу Эккерта и Мокли). [11] Доклад прочитали десятки коллег фон Неймана в Америке и Европе, и он повлиял [ неопределенно ] на следующий этап компьютерных разработок.
Джек Коупленд считает, что «исторически некорректно называть электронные цифровые компьютеры с хранимой программой «машинами фон Неймана » ». [12] Его коллега из Лос-Аламоса Стэн Франкель сказал об отношении фон Неймана к идеям Тьюринга [13]
Я знаю, что в 1943 или 1944 году или около того фон Нейман был хорошо осведомлен о фундаментальной важности статьи Тьюринга 1936 года... Фон Нейман познакомил меня с этой статьей, и по его настоянию я внимательно ее изучил. Многие люди провозгласили фон Неймана «отцом компьютера» (в современном смысле этого слова), но я уверен, что он сам никогда бы не совершил такой ошибки. Его, возможно, можно было бы назвать повивальной бабкой, но он твердо подчеркивал мне и другим, я уверен, что фундаментальная концепция обязана Тьюрингу — в той мере, в какой ее не предвосхитил Бэббидж... И Тьюринг, и фон Нейман, конечно, также внесли существенный вклад в « приведение к практике » этих концепций, но я бы не считал их сопоставимыми по важности с введением и объяснением концепции компьютера, способного хранить в своей памяти программу своих действий и изменять эту программу в ходе этих действий.
В то время, когда был распространен отчет «Первый черновик», Тьюринг работал над отчетом под названием « Предлагаемый электронный калькулятор » . В нем подробно описывалась его идея машины, которую он назвал Автоматической вычислительной машиной (ACE) с точки зрения инженерии и программирования . [14] Он представил ее исполнительному комитету Британской национальной физической лаборатории 19 февраля 1946 года. Хотя Тьюринг знал по своему военному опыту в Блетчли-парке, что то, что он предложил, осуществимо, секретность, окружающая «Колосс» , которая впоследствии поддерживалась в течение нескольких десятилетий, помешала ему сказать об этом. Были созданы различные успешные реализации проекта ACE.
В статьях фон Неймана и Тьюринга описывались компьютеры с хранимой программой, но более ранняя статья фон Неймана получила большее распространение, а описанная в ней архитектура компьютера стала известна как «архитектура фон Неймана». В публикации 1953 года « Быстрее, чем мысль: симпозиум по цифровым вычислительным машинам» (под редакцией Б. В. Боудена) раздел в главе « Компьютеры в Америке» звучит следующим образом: [15]
Машина Института перспективных исследований, Принстон
В 1945 году профессор Дж. фон Нейман, работавший тогда в Школе инженерии Мура в Филадельфии, где был построен ENIAC, от имени группы своих коллег опубликовал отчет о логическом проектировании цифровых компьютеров. Отчет содержал подробное предложение по проектированию машины, которая с тех пор стала известна как EDVAC (электронный дискретно-переменный автоматический компьютер). Эта машина была только недавно завершена в Америке, но отчет фон Неймана вдохновил на создание EDSAC (электронный запаздывающий автоматический калькулятор) в Кембридже (см. стр. 130).
В 1947 году Беркс, Голдстайн и фон Нейман опубликовали еще один отчет, в котором описывалась конструкция другого типа машины (на этот раз параллельной машины), которая была бы чрезвычайно быстрой, способной, возможно, на 20 000 операций в секунду. Они указали, что нерешенной проблемой при создании такой машины была разработка подходящей памяти с мгновенно доступным содержимым. Сначала они предложили использовать специальную вакуумную трубку — называемую « Селектор », — которую изобрели Принстонские лаборатории RCA. Эти трубки были дорогими и сложными в изготовлении, поэтому фон Нейман впоследствии решил построить машину на основе памяти Уильямса . Эта машина, завершенная в июне 1952 года в Принстоне, стала широко известна как «Маньяк». Конструкция этой машины вдохновила по крайней мере на полдюжины машин, которые сейчас строятся в Америке, все они известны как «Джониаки».
В той же книге первые два абзаца главы об ACE звучат следующим образом: [16]
Автоматические вычисления в Национальной физической лаборатории
Один из самых современных цифровых компьютеров, воплощающий разработки и усовершенствования в технике автоматических электронных вычислений, был недавно продемонстрирован в Национальной физической лаборатории в Теддингтоне, где он был спроектирован и построен небольшой группой математиков и инженеров-исследователей электроники из штата Лаборатории, которым помогали несколько инженеров-производственников из English Electric Company, Limited. Оборудование, установленное на сегодняшний день в Лаборатории, является лишь пилотной моделью гораздо более крупной установки, которая будет известна как Автоматическая вычислительная машина, но хотя она сравнительно мала по размеру и содержит всего около 800 термоионных вентилей, как можно судить по таблицам XII, XIII и XIV, это чрезвычайно быстрая и универсальная вычислительная машина.
Основные понятия и абстрактные принципы вычислений с помощью машины были сформулированы доктором А. М. Тьюрингом, членом Королевского общества, в докладе 1 , прочитанном перед Лондонским математическим обществом в 1936 году, но работа над такими машинами в Британии была задержана войной. Однако в 1945 году исследование проблем было проведено в Национальной физической лаборатории г-ном Дж. Р. Уомерсли, тогдашним суперинтендантом математического отдела лаборатории. К нему присоединились доктор Тьюринг и небольшой штат специалистов, и к 1947 году предварительное планирование было достаточно продвинуто, чтобы оправдать создание уже упомянутой специальной группы. В апреле 1948 года последняя стала Электронным отделом лаборатории под руководством г-на Ф. М. Колбрука.
В первом черновике описывалась конструкция, которая использовалась многими университетами и корпорациями для создания своих компьютеров. [17] Среди этих различных компьютеров только ILLIAC и ORDVAC имели совместимые наборы инструкций.
Информацию о датах в следующей хронологии трудно расположить в правильном порядке. Некоторые даты относятся к первому запуску тестовой программы, некоторые даты относятся к первой демонстрации или завершению работы компьютера, а некоторые даты относятся к первой поставке или установке.
В течение десятилетий 1960-х и 1970-х годов компьютеры в целом стали и меньше, и быстрее, что привело к эволюции их архитектуры. Например, отображаемый в память ввод/вывод позволяет обрабатывать устройства ввода и вывода так же, как память. [25] Единая системная шина может использоваться для обеспечения модульной системы с более низкой стоимостью [ необходимо разъяснение ] . Иногда это называют «упорядочиванием» архитектуры. [26] В последующие десятилетия простые микроконтроллеры иногда исключали функции модели для снижения стоимости и размера. Более крупные компьютеры добавляли функции для более высокой производительности.
Использование одной и той же шины для извлечения инструкций и данных приводит к узкому месту фон Неймана , ограниченной пропускной способности (скорости передачи данных) между центральным процессором (ЦП) и памятью по сравнению с объемом памяти. Поскольку одна шина может получить доступ только к одному из двух классов памяти одновременно, пропускная способность ниже скорости, с которой может работать ЦП. Это серьезно ограничивает эффективную скорость обработки, когда ЦП требуется выполнять минимальную обработку больших объемов данных. ЦП постоянно вынужден ждать , пока необходимые данные будут перемещены в память или из нее. Поскольку скорость ЦП и объем памяти увеличились намного быстрее, чем пропускная способность между ними, узкое место стало большей проблемой, проблемой, серьезность которой возрастает с каждым новым поколением ЦП.
Узкое место фон Неймана было описано Джоном Бэкусом в его лекции на вручении премии Тьюринга ACM в 1977 году . По словам Бэкуса:
Конечно, должен быть менее примитивный способ внесения больших изменений в хранилище, чем проталкивание огромного количества слов туда и обратно через узкое место фон Неймана. Эта трубка не только является буквальным узким местом для трафика данных проблемы, но, что более важно, это интеллектуальное узкое место, которое удерживало нас привязанными к мышлению пословно, вместо того чтобы побуждать нас мыслить в терминах более крупных концептуальных единиц решаемой задачи. Таким образом, программирование в основном планирует и детализирует огромный трафик слов через узкое место фон Неймана, и большая часть этого трафика касается не самих значимых данных, а того, где их найти. [27] [28]
Существует несколько известных методов смягчения узкого места производительности фон Неймана. Например, все нижеперечисленное может улучшить производительность [ почему? ] :
Проблему также можно обойти, используя параллельные вычисления , например, используя архитектуру неравномерного доступа к памяти (NUMA) — этот подход обычно используется суперкомпьютерами . Менее ясно, сильно ли изменилось интеллектуальное узкое место , которое критиковал Бэкус, с 1977 года. Предложенное Бэкусом решение не оказало большого влияния. [ необходима цитата ] Современное функциональное программирование и объектно-ориентированное программирование гораздо меньше ориентированы на «передачу огромного количества слов туда и обратно», чем более ранние языки, такие как FORTRAN , но внутренне это все еще то, на что компьютеры тратят большую часть своего времени, даже высокопараллельные суперкомпьютеры.
В 1996 году исследование производительности баз данных показало, что три из четырех циклов ЦП тратились на ожидание памяти. Исследователи ожидают, что увеличение числа одновременных потоков инструкций с многопоточностью или многопроцессорностью на одном чипе еще больше усугубит это узкое место. [29] [30] В контексте многоядерных процессоров требуются дополнительные накладные расходы для поддержания согласованности кэша между процессорами и потоками.
Помимо узкого места фон Неймана, изменения программ могут быть весьма вредными, как по ошибке, так и намеренно. [ требуется ссылка ] В некоторых простых конструкциях компьютеров с хранимой программой неисправная программа может повредить себя, другие программы или операционную систему , что может привести к сбою компьютера . Однако эта проблема применима и к обычным программам, в которых отсутствует проверка границ . Защита памяти и различные элементы управления доступом обычно защищают как от случайных, так и от вредоносных изменений программ.