Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ураков А.Р. Технологические особенности проектирования вычислительной техники.doc
Скачиваний:
34
Добавлен:
02.05.2014
Размер:
839.17 Кб
Скачать

3.2. Реализация эвм, как машины фон Неймана

Дальнейшие шаги отражены в принципах, положенных в основу машины фон Неймана. Из всех этих принципов нам интересны следующие: 1) двоичный алфавит; 2) память – линейный вектор машинных ячеек; 3) команды и данные располагаются в одной общей памяти; 4) тип данных не является атрибутом данных; 5) машина состоит из памяти процессора и устройств ввода-вывода.

1) Двоичный алфавит.

В машине фон-Неймана во всех случаях используется только двоичный алфавит. Это требование определяется особенностями электрических схем и подробно мы его рассматривать не будем.

2) Память – линейный вектор машинных ячеек.

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

3) Общая память команд и данных.

Рассмотрим еще раз каретку в машине Тьюринга. Это конечный автомат, который создан так, чтобы выполнять определенный алгоритм. Благодаря тому, что количество ячеек ленты теоретически не ограничено, очень сложный алгоритм может реализовать достаточно примитивный конечный автомат каретки. Однако проблема в том, что в классической машине Тьюринга в одной ячейке находятся команды и данные. Это требует создания весьма сложных (объемных) ячеек, которые, будучи реализованы в таком виде, значительно снижают производительность машины и объем ленты, а значит размер программы и количество данных, которое может быть обработано. В то же время, было замечено, что обычно одна программа (один набор команд) используется для обработки большого числа разных данных. Это значит, что можно сделать каретку такой, чтобы она всегда выполняла один и тот же заданный алгоритм, а на ленте в этом случае можно размещать только данные. Это значительно упрощает устройство машины. Более того, первые вычислительные машины были реализованы именно в таком упрощенном виде.

Однако, что делать, если мы захотим поменять алгоритм работы нашей каретки? Нам придется переделать ее. Таким образом, изменение программы, по которой происходят вычисления, в такой упрощенной машине Тьюринга весьма сложная задача, требующая в каком-то смысле ее переделки. На практике так и происходило, изменение программы на первых ЭВМ требовало наличия команды инженеров и техников и весьма сложных операций с их стороны. Возврат к сложным ячейкам как в классической машине Тьюринга не решал проблемы.

Можно предположить, что если автомат каретки будет достаточно сложным, кроме самих данных он сможет обрабатывать и алгоритм, по которому ему следует исполнять данные. Пусть это потребует усложнения конечного автомата каретки, зато он будет неизменен в течение всего времени жизни машины. Таким образом, машина сможет обойтись без команды инженеров, изменяющих ее устройство, а значит может быть запущена в широкое применение.

Таким образом, для работы ЭВМ, кроме данных для обработки, ей требуется поставлять алгоритм, по которому следует обрабатывать данные. Для хранения алгоритма можно использовать отдельную ленту. Однако, как было показано ранее, несложно сделать ленту (или оперативную память) в машине Тьюринга такой, чтобы каретке не приходилось перемещаться пошагово от ячейки к ячейке – она мгновенно окажется около той ячейки, которая нам нужна. Соответственно, в машине фон Неймана предлагается разместить программу работы каретки на той же ленте, на которой хранятся данные, отводя для этого некоторый участок ленты (оперативной памяти). Это позволяет не просто упростить устройство машины. Более важным оказался следующий эффект. Размер памяти с произвольным доступом, с помощью которой мы реализовали ленту, ограничен довольно небольшой величиной, и наша гипотетическая лента в реальности не может быть длинной. Пусть у нас разные ленты для программ и данных, причем мы знаем, что общая длина этих лент ограничена нашими техническими возможностями. Тогда перед нами встает трудноразрешимая задача оптимального выбора взаимного объема этих лент, так как в одних задачах требуется большая часть памяти для программы и совсем малая для данных, во-вторых наоборот, а в третьих задачах размеры лент соотносятся, например, как один к одному. Если мы храним данные и программы в общей памяти, мы можем в ходе работы менять размеры участков, отводимых под программы и данные. Машина становится более универсальной.

Далее, хранение программ и данных в одной общей памяти позволяет создавать модифицирующие в ходе работы программы, что, в свою очередь, позволяет реализовывать более сложные алгоритмы на более коротких программах, и это достоинство казалось весьма важным в то время. К сожалению, в наше время это же качество является источником возможных ошибок, а также используется при создании некоторых вирусов как способ передачи управления нужному коду. Чтобы избежать этого недостатка, в современные машины встраиваются механизмы защиты, позволяющие отделить программы от данных, однако принцип общей памяти остается тем же.

Выбор разрядности вычислительной машины

Мы собираемся хранить на нашей ленте самые различные данные, например: тексты, целые числа со знаком и без знака, вещественные и комплексные числа с разной точностью и т.д., и т.п. Понятие тип данныхпо отношению, например, к переменной указывает абстрактный набор всех значений, которые может принимать эта переменная. Известны способы, с помощью которых любые данные можно свести к числам, поэтому далее мы будем говорить только о хранении чисел. Ограниченные возможности вычислительных машин не позволяют обрабатывать бесконечное множество всех чисел, но нам нужно определиться с каким конечным набором мы сможем работать. Для целых чисел мы можем указатьдиапазон, т.е. интервал доступных нам чисел от минимального до максимального. Для вещественных чисел мы не можем добиться бесконечной точности, поэтому кроме диапазона требуется указать еще иточность, с которой они будут представлены в машине. Для математических целей, конечно, хотелось бы видеть и точность и диапазон как можно большими, однако, это требует большой мощности машины, а при определенной доступной нам мощности нам приходится мириться с ограниченной скоростью вычислений и ограниченным объемом хранимых данных, и в какой-то момент нам придется решать задачу выбора между скоростью и точностью вычислений.

При конструировании ЭВМ диапазон и точность задаются на момент проектирования размера ячеек на нашей ленте. Так как в машине фон Неймана данные всегда хранятся в двоичном виде, количество двоичных элементов (битов) в одной ячейке определяет ее размер и называется разрядностью. Наша каретка должна быть настроена на обработку данных именно такого размера, каков размер ячеек ленты, поэтомуразрядностьтакже и характеристика процессора. На практике разрядность процессора может отличаться от разрядности памяти. Для этого есть свои специфические причины, мы их здесь рассматривать не будем, просто полагая, что разрядность процессора и памяти совпадают и определяютразрядность вычислительной машины.

Если мы заранее знаем требования, которые будут предъявлены к точности и диапазону данных при решении нашей задачи, то мы сможем предварительно указать и требуемую разрядность. Другой подход характерен для большинства практических задач, решаемых на современных персональных ЭВМ. В них, при решении таких задач, запас по скорости вычислений и точности настолько огромен, что для всех хранимых чисел используются одинаковые точность и диапазон, которые почти всегда оказываются выбранными с многократным запасом. Что же делать, когда такого запаса производительности нет?

В таких случаях выбор разрядности машины является весьма сложной задачей, так как существуют задачи, требующие однозначно большой точности, и задачи, в которых высокая точность бессмысленна или ей требуется пожертвовать ради скорости. Самым неприятным является то, что машина, в которой однозначно задана разрядность всех данных, становится менее универсальной. Машина с большой разрядностью, при том же количестве элементов переключения в процессоре оказывается более примитивной (элементы переключения расходуются на организацию большой разрядности процессора) и теряет производительность на задачах, где не требуется большая точность. Машину с недостаточной разрядностью нельзя будет использовать при решении некоторых задач.

Выход был найден в следующем. Разрядность выбирается настолько малой, насколько это еще имеет смысл. Если требуется записать число с большим диапазоном значений или большой точностью, для хранения одного числа используется несколько ячеек ленты. При программировании это учитывается, то есть программы пишутся так, чтобы операция с числом, занимающим несколько ячеек, происходила в несколько этапов, с использованием каждой ячейки по отдельности (для таких вычислений существуют специальные несложные правила). Конечно, это замедляет скорость работы машины при вычислениях, требующих большой точности, но позволяет сделать нашу машину более производительной (на ряде задач) за счет архитектурного усложнения процессора (элементы переключения, которые обеспечивали большую разрядность могут быть использованы, например, для увеличения количества доступных машине команд). В итоге машина становится более универсальной.

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

Проблема выбора разрядности и ее влияние на производительность более подробно рассмотрена в следующих главах.

4) Тип данных не является атрибутом данных.

Мы уже пришли выводу, что разные данные в зависимости от требуемой точности должны быть представлены в машине по-разному. Как это правило реализовать на практике, чтобы с машиной было удобно работать (удобно писать программы)? Для этого используются типы данных, однако в отличие от математических типов, где множество, например, целых чисел бесконечно, в машине любой тип данных описывает конечное множество, причем мощность этого множества определяется разрядностью и количеством ячеек памяти, используемых для хранения величины конкретного типа. Важно, что разные типы данных могут занимать одинаковое количество ячеек, но при этом отличаться разными представляемыми диапазонами или точностью.

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

Важно понимать отличие между математическими и машинными типами данных. Покажем это на примере. Известно, что множество целых чисел входит в множество вещественных, множество вещественных в множество комплексных, а число с меньшей точностью может быть записано как число с большей точностью. Это значит, что целое число (в математическом смысле) вполне можно записать в машине, например, в виде вещественного числа (а это уже машинный тип данных), другими словами для преобразования целого числа в двоичный формат использовать правило преобразования для вещественных чисел. До начала преобразования для нас это число было целым, но для машины вещественным. Так как в машине количество вещественных чисел ограничено, вполне может оказаться так, что исходное целое число не может быть представлено в машине точно. Для представления будет использоваться ближайшее вещественное число. Мы сможем снова получить целое число только в том случае, если выполним операцию обратного преобразования вещественного числа в целое число (в данном случае мы можем использовать округление). Отсюда следует, что для правильной интерпретации данных в вычислительной машине важно знать их тип.

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

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

5) Машина состоит из процессора, памяти и устройств ввода вывода.

До того как мы создадим машину и она начнет работать, нам следует решить две задачи. Первая, как мы будем предоставлять машине данные для обработки. Эта задача называется вводом данных. Вторая, как мы будем по мере их получения результатов забирать из машины. Эта задача называетсявыводом данных. (см. рис. 2). На самом деле задачи ввода и вывода преследуют разные цели и должны решаться разными способами.

Рис. 2

В идеале, при вводе данные должны сами появляться в каких-то ячейках нашей ленты, а при выводе мы должны уметь считывать их с нашей ленты (необязательно считывать все ячейки, а лишь ту, в которой будет помещен результат работы машины). Первые решения были крайне простыми и очевидными. Ячейку ввода на ленте подсоединили к переключателям, и ввод новых данных просто заключался в правильной установке этих переключателей. Для вывода к битам ячейки вывода подсоединили лампочки. Фиксация результата заключалась либо в записи увиденного оператором ЭВМ состояния лампочек, либо в документальной форме – фотографированием лампочек. По мере роста производительности ЭВМ оказалось, что вывод информации крайне дорог и ненадежен, а ввод иногда занимает больше времени, чем сами вычисления. Стало понятно, что и ввод и вывод данных должны осуществлять специальные устройства, которые и были названы устройства ввода-вывода. Процессор, работающий по программе вычислений, грубо говоря, «первым узнает» в какой момент готовы результаты, и в какой момент можно принять новые данные. Следовательно, скорость ввода-вывода будет максимальной, а результаты наиболее надежными, если ввод-вывод будет осуществляться под управлением процессора. Сам же ввод-вывод по-прежнему заключается в переносе данных из устройств ввода-вывода в оперативную память или обратно. В машине фон Неймана для этого предлагается два способа. Интересно, что перенос данных из устройства ввода-вывода в память можно организовать так же, как и нормальную для процессора операцию переноса данных из одной ячейки памяти в другую. Таким образом, первый способ заключается в том, что процессор самостоятельно переносит данные. Второй способ заключается в том, что устройства переносят данные самостоятельно, без участия процессора, такой способ называется прямым доступом к памяти. Второй способ требует гораздо более сложной организации устройств ввода-вывода, однако, позволяет не снижать скорость выполнения задач, что становится ощутимым, если загрузка процессора велика, а поток данных через устройства ввода-вывода очень высок.

Когда устройство ввода-вывода становится достаточно сложным, оно, вместо управляющего конечного автомата, может комплектоваться специальным процессором, выполняющим как управление устройством, так и организующим перенос данных. Этот процессор работает под управлением собственной программы, записанной на встроенной в устройство ввода-вывода ленте. Технологический эффект здесь заключается в том, что при модификации устройства ввода-вывода не обязательно изменять конечный автомат, а можно лишь изменить управляющую программу, что сделать гораздо проще. Другой случай, когда несколько простых устройств снабжаются общим процессором. Эффект здесь тот же, что и в предыдущем случае. При изменении состава или вида устройств ввода-вывода достаточно лишь модифицировать программу. Каждый из таких процессоров включен по принципам машины фон Неймана. Мы получаем, что в одну машину фон Неймана вложены другие, что вполне допустимо с точки зрения принципов, по которым созданы эти машины. Чтобы отличать эти процессоры друг от друга, процессор, работающий с основной программой, называется центральным процессором, а все остальные либо получают названиепериферийный процессор, либо называются по выполняемым функциям:процессор ввода-вывода,графический процессор, и т.п.