Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Устройство персонального компьютера #7


Информационный Канал Subscribe.Ru

Устройство персонального компьютера

В этом выпуске мне бы следовало описать особенности работы интеловских Pentium 4 в соответствии с установленным порядком раскрытия "железных" тем. Однако по некоторым причинам я этого делать не стал. Почему? Еще на этапе организации рассылка задумывалась мною как нечто, несущее полезную информацию в форме, достаточной для понимания простыми смертными, могущими в последствии обратить сию информационную полезность во благо (материальное, "железное"). А потому, никаких недомолвок в моем повествовании быть не может. Т.е. каждая очередная тема должна быть понятна от и до. Техника развивается семимильными шагами, и вроде бы следует поспешить в целях своевременного освещения особенностей передовых разработок. Но что толку, если вы будете находиться в курсе всех этих навороченных решений (о которых, кстати, в Сети информации навалом), в то время как суть их функционирования будет вам не доступна. Да, на железных сайтах (речь пока идет о Рунете) имеется теоретический материал, но во-первых, нужно потрудиться, чтобы его отыскать в многотысячных архивах статей и, во-вторых, представленные сведения в большинстве своем оказываются разрозненными и неполными. Даже печатные издания страдают этой болезнью: освещать-то они освещают и даже экономический анализ приводят, но вот о пути следования своих соображений и причинах, повлиявших на формирование их мнения повествуют как-то невнятно, не глубинно, что ли (сразу приношу свои извинения за #6 выпуск рассылки).
Это мое личное мнение, всем без исключений позволено с ним не соглашаться :) А материал о Pentium 4 ожидает вас в следующем выпуске. И еще: я бесконечно рад всем тем, кто до сих пор продолжает читать мою рассылку несмотря ни на что.

Выпуск: #7
 
О принципах работы процессоров еще разок
 

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

Схема работы всех компьютерных процессоров едина и заключается в следующем: процессор берет различные сигналы в форме 0 и 1 (на физическом уровне это выражается отсутствием или наличием напряжения на входе соответственно, т.е. сигнал двоичный), манипулирует этими сигналами согласно заданной последовательности команд и выдает результат, также в форме 0 или 1. В соответствии с устоявшимся стандартом напряжение в 3,3 В - это 1, а 0 В - 0.
Результат зависит от принятого процессором решения, факт воплощения которого возможен благодаря наличию различных комбинаций электрических схем. Эти схемы носят название логических элементов, т.к. способны реализовывать простейшие логические операции. Каким образом это возможно? Чтобы сие понять, придется чуток поднапрячься и припомнить некоторые азы школьной физики и математики.
Во-первых, всякий логический элемент в целях "реализации решательных функций" должен содержать как минимум один транзистор. Схемы элементов, отвечающих за различные логические действия, также различны. Современные процессоры содержат миллионы транзисторов, что свидетельствует о крайней сложности логических систем.
Логические элементы вступают во взаимодействие друг с другом, это позволяет им решать весьма многообразный круг задач.

Булева логика, в основе которой лежит алгебраическая система, разработанная математиком Джорджем Булем, - способ придать электронным системам способность принимать решения (ну, или хотя бы имитировать "думательный" процесс). Главными булевыми операторами являются И (AND), ИЛИ (OR), НЕ (NOT), из которых строятся всевозможные комбинации.
Логические элементы, схемы которых реализуют оператор «И» дают на выходе (результат принятия решения) 1 в том случае, если на каждый вход (а их 2) также была подана единица. Ситуация описывающая работу логического элемента «И» может быть смоделирована следующим образом. Имеется 2 условия. К примеру, X>2 - первое условие; X<9 - второе условие. И есть какая-либо команда: что-нибудь типа X*2. Если на выходе со схемы логического элемента «И» будет 1 (т.е. наличие напряжения в 3,3 В), то команда выполнится (т.е. процессор вычислит произведение). Для этого необходимо, чтобы на обоих входах было по 3,3 В. Единицу на входе обеспечивает соблюдение условия, т.е. если X действительно > 2, то один из входов окажется под напряжением. Со вторым условием аналогично. Итак, берем X=6. Проверяем: 6>2, 6<9 - условия соблюдены, на выходе напряжение, а, следовательно, команда выполнится, и результат 6*2=12.
Команда «ИЛИ» дает 1 на выходе, если хотя бы одно из условий верно.
Операторо «НЕ» приводит к инверсии исходных данных, меняя входную 1 на 0 и наоборот.
Комбинации логических элементов позволяют выполнять арифметические операции (в соответствии с правилами булевой алгебры), а также извлекать данные, хранящиеся в памяти.

Транзистор исполняет роль выключателя (реле, ключа) в схеме. Т.е. при подаче напряжения к нему, происходит замыкание цепи, что позволяет течь по ней электрическому току. Кстати, ранние модели процессоров ПК, в том числе и некоторые Pentium, управлялись не 3,3 В, а 5 В. Таким образом, подали мы на транзистор 3,3 В (или около того), цепь замкнулась, не подали - так и осталась разомкнутой.
Миллионы подобных транзисторов в современных процессорах работают совместно согласно инструкциям программы, осуществляя контроль над потоком электричества, проходящего через логические элементы, с целью достижения требуемого результата. И опять же, каждый логический элемент содержит один и более транзисторов, и каждый транзистор отвечает за контроль над током посредством изменения состояния цепи (ВКЛ/ВЫКЛ или без изменений).

Теперь обратимся непосредственно к простейшим схемам логических элементов «И» и «ИЛИ». Итак, у нас есть участок цепи, по которой должен течь ток (Supply current слева направо). В качестве размыкателей цепи используются Transistor'ы. На схеме AND если на Transistor 1 не подается напряжение, то цепь разомкнута, и ток течь не может. И даже если мы подадим напряжение на Transistor 1 (предположим, что мы его подали по причине соблюдения условия X>2), прямо по курсу Transistor 2. На выходе мы получим сигнал лишь в том случае, когда и 2-ой транзистор окажется под напряжением (а он окажется, ибо 6<9). Кстати, за проверку соблюдения этих условий отвечают другие логические элементы (и их комбинации), формирующие Input 1 и Input 2 для элементов AND и OR подобно тому, как последние формируют Output current.

С элементом OR также все просто. Если наверху цепь разомкнута, то ток пойдет понизу через Transistor 2 и наоборот. Таким образом, реализуется нестрогое условие. К примеру, если X<-1 «ИЛИ» X>2, то выполнить X*2. Команда останется не выполненной только тогда, когда X не удовлетворит обоим условиям.
Глядя на схемы (а это всего лишь модели), может сложиться впечатление, будто транзисторы это обособленные (индивидуальные, дискретные) элементы. Однако это не так. Огромное количество транзисторов изготавливается из одного кусочка кремния (или иного полупроводникового материала) и соединяются вместе без посредства проводов и прочих внешних проводящих материалов. Эти объединения называют интегральными схемами (ICs), и их рост (усовершенствование), в основном, и превращает процессор в сложную систему и, кстати говоря, интеграция схем на этом не прекращается. Подобно тому, как интегральные схемы объединяют множества транзисторов, множества интегральных схем также связываются определенным образом в процессе так называемой крупномасштабной интеграции (LSI). Существуют даже "чрезвычайно крупномасштабные интеграции" (VLSI - надеюсь, и без моей помощи понятно, что именно они объединяют).
Современные процессоры содержат десятки миллионов микроскопических транзисторов. Всевозможные их комбинации с резисторами, конденсаторами и диодами образуют различные логические элементы, отвечающие за выполнение тех и или иных действий и операций. Логические элементы лежат в основе интегральных схем, которые, в свою очередь, составляют основу электронных систем.

Высокоуровневая интеграция всех логических элементов в едином сложном процессорном чипе принесла Intel мировую известность. Чип назывался Intel 4004 и был выпущен в конце 1971 года. Он представлял собой 4-битный микропроцессор, предназначенный для использования в калькуляторах. Несмотря на то, что обработка производилась 4-битных данных, длина инструкций составляла 8 бит. Память была поделена на части: одна для программ, другая для данных - 1 Kb и 4 Kb соответственно. Наличествовали также 16 4-битных (или 8 8-битных) регистров общего назначения. 4004 оперировал 46 инструкциями, используя всего-навсего 2300 транзисторов на 16 контактной DIP-схеме, и работал на тактовой частоте в 740 kHz (8 тактовых циклов за 1 процессорный цикл в 10,8 микросекунд). Если то, что написано в скобочках не совсем понятно, не расстраивайтесь. Нижеследующий материал призван объяснить некоторые нюансы, связанные с частотами.
В течение нескольких лет 2 семьи микропроцессоров доминировали на рынке ПК - Intel'овский Pentium и PowerPC от Motorola. Эти линейки олицетворяли 2 конкурирующие процессорные архитектуры прошлых двух десятилетий. Первая являла собой CISC-чип, а последняя - RISC (о них я упоминал в предыдущих выпусках).

Главными функциональными компонентами процессора являются:

  • Ядро с исполнительным блоком. Pentium'ы имеют в своем арсенале 2 параллельных целочисленных конвейера, позволяющих процессору читать, интерпретировать, выполнять и записывать результат 2-х команд одновременно.
  • Предсказатель ветвлений (Branch Predictor), в обязанности которого входит прогнозирование очередной последовательности в каждой точке тела программы, где наличествует условный переход. Другими словами, он должен с высокой степенью вероятности предсказать, какой блок кода, скорее всего, придется выполнять после проверки условия (т.е. предсказать результат проверки). Для чего это надо? Команда не выполняется за раз. Она также требует времени на чтение, раскодирование, интерпретацию и проч. Предсказатель ветвлений (или прогнозатор перехода) заранее сообщает исполняющему модулю, над какими инструкциями ему в ближайшие мгновения, возможно, придется работать. И, как следствие, в процесс включаются блоки предвыборки и декодирования, подготавливающие "наиболее вероятную" инструкцию к непосредственному выполнению.
    Если предсказание окажется верным, то исполняющему блоку, когда наступит подходящий момент, останется только выполнить инструкцию (ведь все подготовительные операции уже произведены).
  • Сопроцессор для операций с плавающей точкой (FPU) - 3й исполнительный модуль в процессорах, отвечающий за вычисление дробей.
  • КЭШ первого уровня (Level 1). У Pentium имеется в арсенале 2 КЭШа, расположенных на чипе, по 8 Kb каждый (для кода и данных), которые гораздо "шустрее", нежели их большой внешний собрат - вторичный КЭШ.
  • Шинный интерфейс, доставляющий смесь кода и данных центральному процессорному устройству, разделяющий на 2 потока готовые к употреблению код и данные, объединяющий потоки, выдаваемые процессором, и отправляющий их смесь обратно.

Все элементы процессора "шагают в ногу" благодаря "часам", которые устанавливают общий темп работы. Самые первые микропроцессоры имели 100 килогерцовые часы (100 KHz), тогда как Pentium Pro уже мог похвастаться часами в 200 MHz - числом, показывающим сколько "тиков" в секунду производят часы (или сколько импульсов генерирует тактовый генератор за 1 секунду). Т.е. в данном случае 200 млн. "тиков" (тактов) в секунду.
По "тику" часов происходят различные вещи. Когда приходит время, блок управления отсылает инструкцию из памяти в Регистр инструкций. Адрес очередной инструкции для выполнения хранится в программном счетчике PC (Program Counter - некоторая область внутренней памяти), периодически обновляющемся. Т.е. в момент отсылки инструкции значение PC увеличивается так, чтобы оно адресовалось на следующую команду в последовательности. В это время процессор выполняет отправленную ему инструкцию.
Некоторые инструкции обрабатываются блоком управления самостоятельно. К ним, например, относятся команды, предписывающие переходы по различным адресам. Поясняю: команда ПЕРЕЙДИ по адресу 2047 приказывает блоку записать в PC адрес 2047, и процессор примется за обработку той инструкций, что находится по адресу 2047.

Огромное количество команд привлекает к работе арифметико-логическое устройство (ALU), которое функционирует совместно с Регистрами общего назначения (о регистрах читайте в ранних выпусках рассылки) - хранилищах, динамически заполняемых данными из памяти. Типичная ALU-команда: ДОБАВИТЬ содержимое некоторой области памяти в регистр общего назначения.
ALU также отвечает за изменение битов в Регистре состояния (SR) в соответствии с результатом исполнения предыдущей инструкции. Обычно, Регистр состояния имеет биты, сообщающие о нулевом результате, о переполнении, о переносе и т.п. Блок управления использует информацию в SR для выполнения условных команд, типа: "ПРЫГАЙ по адресу 777, если предыдущим результатом стало переполнение (overflow)".

В принципе любая операция, независимо от степени ее сложности, может быть выполнена посредством последовательности простых команд подобно описанным выше.

Теперь относительно производительности. Законы физики не позволяют инженерам-разработчикам увеличивать тактовые частоты как им заблагорассудится, лимитируя диапазон пригодных к использованию значений. И несмотря на то, последние повышаются из года в год, одно это не может дать того эффекта производительности, что мы имеем на сегодняшний день. Данная проблема составляет основную причину для поиска и исследования методов, призванных заставить процессор выполнять как можно более крупные порции работы за каждый импульс сигнальных часов (такт, "тик").
В качестве одного из подходов к решению проблемы можно и нужно рассматривать способы расширения шины данных и увеличения объема регистров. Даже 4-битный процессор может сложить два 32-разрядных числа, однако это потребует такой уймы команд, что ОГО-ГО. В то время, как процессор с 32-битной архитектурой выполнит операцию сложения посредством всего одной команды. Сейчас очень широко распространены 32-разрядные системы, однако варианты с 64 разрядами достаточно стремительно заполоняют собой прилавки компьютерных салонов, а разработчики программного обеспечения адаптируют очередные версии своих продуктов (я имею ввиду операционные системы, различные компиляторы и проч.) под особенности работы 64-битных систем (тот же Microsoft).

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

Как уже говорилось, инструкция не может быть выполнена "за раз", т.е. за 1 тактовый импульс (1 "тик" часов). В самом общем случае на все про все требуется 5 тактов: один, чтобы инструкцию загрузить, один, чтобы ее декодировать, один, чтобы получить для нее данные, один, чтобы наконец-таки инструкцию выполнить и один, чтобы записать результат. Таким образом, очевидно, что 100 MHz процессор, следуя вышеописанной схеме, на деле мог бы выполнить только 20 млн. команд (тогда как тактовых импульсов было бы затрачено 100 млн.), что, согласитесь, попахивает явным расточительством физических ресурсов системы.

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

Решение этой проблемы основывается на применении конвейерной обработки (Pipeline), принцип которой схож с принципом работы поточных линий на фабриках и заводах. Конвейерная схема предусматривает непрерывную загрузку исполнительных блоков. Этим исключается необходимость ожидания завершения работы над одной инструкцией, и идет одновременная обработка 5 инструкций, находящихся на разных стадиях. Так, в каждый момент времени ("тик" внутренних часов) одна инструкция загружается, другая декодируется, для третьей загружаются данные (для той, что в данный момент декодируется и в перспективе будет выполнена), четвертая инструкция выполняется, а блок, отвечающий за 5 стадию, записывает результат, полученный исполнением пятой инструкции (т.е. той, что предшествовала в данный момент выполняющейся, "четвертой"). Применение настоящей технологии формирует эффект, будто каждая инструкция занимает 1 такт. Но, как можно заметить, это лишь иллюзия. Непрерывная постадийная загрузка конвейера приводит к тому, что при очередном тактовом импульсе всегда оказывается обработанной хотя бы 1 инструкция, т.е. каждый "тик" дает результат выполнения команды, успевшей пройти 5 стадий обработки за прошедшие 5 "тиков".
Более того, большинство современных процессоров имеют суперскалярную архитектуру, предусматривающую дублирование схемы конвейера. Это позволяет обрабатывать несколько инструкций, находящихся на одной стадии, параллельно. К примеру, на одном такте возможна одновременная загрузка 2-х инструкций, одновременное декодирование 2-х других и т.д. Pentium Pro (1995 г.), помнится, таким вот образом мог на каждый тактовый импульс выдавать сразу 5 результатов.

Пока на сегодня все. Остались вопросы? Присылайте их по адресу vumalkov@rambler.ru. Предложения, пожелания и прочее шлите туда же.




Copyright © 2004 by Вадим Мальков
Все права защищены.


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: industry.comp.20pcarc20
Отписаться
Вспомнить пароль

В избранное