Как процессор понимает команды
Перейти к содержимому

Как процессор понимает команды

  • автор:

Как процессор понимает команду?

Читаю книгу «Код.Тайный язык информатики». Возник такой вопрос. В главе 17 автор показывает простую схему компьютера, и принципы его работы. Так вот в том примере процессор получал команду, например (загрузить/сложить /сохранить) в двоичном виде. Как я понял, примерно так работал intel 8080. Я не могу понять как процессор понимает, команду загрузить(к примеру 0000001), то есть как он понимает, что ему нужно конкретно сделать? Эти команды заданы физически и потом как-то сравниваются?

  • Вопрос задан более года назад
  • 472 просмотра

Комментировать
Решения вопроса 1

nava2002

Ну если просто, то углубившись в рассматривание микропроцессора мы увидим что на самом «дне» находится так называемые » Элементы цифровой логики» «И, ИЛИ, НЕ».
Это кубики «ЛЕГО» из которых все собрано. Это атомы всей цифровой техники.
Так вот если мы скажем поставим параллельно 8 элементов и подадим на них скажем 8 сигналов (с какими то логическим уровнем 0 или 1 — «00101001» то на выходе мы получим 8 ответных сигналов (в зависимости какой элемент находится в данной позиции «101011100») .
Ну вот эта последовательность кубиков ЛЕГО и определяет систему команд процессора. (например х86, или ARM. ) и ЭТА система команд ЖЕСТКО зашита в конкретный процессор.
Ну а дальше все как катушка с нитками, размещаем соединения всякие штуки для памяти и учитывая что в процессоре миллионы транзисторов, а скажем элемент «НЕ» содержит 2 транзистора, то понятно сколько там этих «кубиков» в процессоре.

P.S. Но если честно то углубляться в эти дебри рационального смысла не имеет так как на Ассемблере 1 команда ну например в 32х разрядном процессоре это скажем 3 слова по 4 байта то есть 12 байт, а скажем программа на С++ после компиляции занимает 200 килобайт то написать код в 16000 строк это задача для истинного мазохиста. такие задачи делает коллектив и каждый все равно пишет по 1-2 тысяче строк потом это сливают в общий проект и потом мы получаем ОС Win10 которая занимает 4 гигабайта кода ну в общем невообразимый объем работы.

Ответ написан более года назад
Комментировать
Нравится 2 Комментировать
Ответы на вопрос 2

hint000

у админа три руки

predecoder, предекодер — предварительный декодер, разделяющий несколько CISC-команд из порции на отдельные элементы (см. x86), используя информацию от длиномера. Подготовка команд может происходить наперёд их дальнейшей обработки декодером, если до него есть буфер.

ILD (instruction length decoder: декодер длин команд), длиномер — определитель длин CISC-команд. В x86-ЦП анализирует их префиксы, опкоды и байты modR/M. В ЦП Intel длиномер является частью предекодера, измеряя длины «на лету». В большинстве ЦП AMD он работает с командами при их загрузке из L2 в L1I, сохраняя разметку байтов команд в дополнительных битах в L1I, считываемых предекодером при загрузке порции.

ID (instruction decoder: декодер команд), decoder (декодер) — набор блоков, преобразующих команды в мопы. В x86-ЦП состоит из нескольких трансляторов и одного микросеквенсера (генератора последовательности мопов) с ПЗУ для микрокода. Осуществляет микрослияние и макрослияние.

translator («переводчик»), транслятор — часть декодера, обрабатывающая простые и частые команды без использования микрокода. В x86-ЦП Intel есть 1–3 простых транслятора (на 1 меньше числа путей конвейера), каждый из которых переводит команду в 1 моп за такт, и 1 сложный транслятор, переводящий команду в 1–4 мопа/такт. Как правило, число генерируемых трансляторами мопов не больше числа путей. Большинство ЦП AMD имеют 3–4 транслятора, каждый из которых переводит команду в 1–2 мопа/такт. Макросливаемые команды обрабатываются парами любым транслятором, но не более одной пары за такт.
.

Ответ написан более года назад
Комментировать
Нравится 2 Комментировать

Rst0

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

Ответ написан более года назад
Комментировать
Нравится 1 Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

процессоры

  • Процессоры
  • +4 ещё

Можно ли прошить Acer RS880M05 rev1.1 под АМ3+?

  • 1 подписчик
  • 19 янв.
  • 59 просмотров

Как компьютер понимает команды?

Есть двоичный код-условное обозначение нулей и единиц для пк(есть напряжение и нет напряжения).
А как пк понимает,что делать при команде 010011,а что при 0010011?
ну,например,есть ребенок лет 3-х,ему дают предложение-сходи,купи телефон-команда
наша азбука-двоичный код,а ребенок-пк,
Но нужно же еще объяснить этому 3-х-летнему ребенку,что значит купить,ходить и телефон
Примерно и такой вопрос у меня про компьютеры.

  • Вопрос задан более трёх лет назад
  • 6934 просмотра

7 комментариев

Простой 7 комментариев

rockon404

Потратьте время на чтение любой хорошей книги по архитектуре компьютера.
1Tima1 @1Tima1 Автор вопроса
Антон Спирин, нужно выбрать-«для чайников»,или там все «для чайников»?

rockon404

1Tima1, начните с Таненбаума
1Tima1 @1Tima1 Автор вопроса
1975 года нормально,или самое то?
1Tima1 @1Tima1 Автор вопроса
Антон Спирин, какое издание лучше?

rockon404

1Tima1, Архитектура Компьютера 6-ое издание. В оригинале вышла в 2012.
1Tima1 @1Tima1 Автор вопроса

5d37198414b8c138901506.jpeg

Антон Спирин, поехали)

Решения вопроса 1

Zoominger

System Integrator

Слишком размытый вопрос.
«Понимает» не ПК, а процессор, который принимает процессорные команды и выполняет их, гоняя байты и биты, посылая определённые сигналы по шинам другим устройствам и из всего этого, через уровни абстракции от нижних к верхним, происходит просмотр котиков на Ютубе.
Подробное объяснение займёт страниц этак двадцать в общих чертах.

Ответ написан более трёх лет назад
Нравится 3 21 комментарий
1Tima1 @1Tima1 Автор вопроса

но нужно же сначала забить «эти процессорные команды» в сам процессор!
ведь если вы напишите что-то другое,то он не поймет

Zoominger

но нужно же сначала забить «эти процессорные команды» в сам процессор!

ведь если вы напишите что-то другое,то он не поймет

«Мы» ничего не пишем, пишут компиляторы, которые точно знают, что делают, как и инженеры-проектировщики ЦП.

1Tima1 @1Tima1 Автор вопроса

Рональд Макдональд, так я не говорю не про ассемблер,я имею в виду-как процессор понимает команды такие-100101010010101001010101010110

Zoominger

1Tima1, всё несколько сложнее, чем просто 0101001010101.
1Tima1 @1Tima1 Автор вопроса

Рональд Макдональд, ну может есть какое-то объяснение??
это же должны были понять еще первые создатели компьютеров?!

Zoominger

1Tima1, если заниматься этим вот прям серьёзно, то советую книги по архитектуре старых процессоров типа Intel 8086, по нему есть даже статьи, которые дадут составить хоть какое-то представление.

Просто чем дальше, тем больше навешивали на ЦП разные примочки, из-за чего даже простое объяснение размажется реально на сотни страниц.

1Tima1 @1Tima1 Автор вопроса
Иван,
вы про и и или?
ну вот есть,нет,есть,есть,нет и что процессор с этим сделает?

Griboks

1Tima1, на всех ход подается 111001, процесс включается определённый каскад, корой отвечает за этот код (очень грубо). По сути, это схемотехника, только в ней в миллион раз больше конденсаторов, резисторов, катушек и транзисторов.

1Tima1 @1Tima1 Автор вопроса
Griboks, можно чуть подробнее после того как я написал код-10100110?

Griboks

1Tima1, он превратился в электрический ток и отправился на схему
1Tima1 @1Tima1 Автор вопроса

Griboks, ну то есть 1-есть напряжение-получится электрон,0-нет напряжение-будет пустота?
и что с этим током будет в схеме?

Griboks

1Tima1, нет, 1110 — это 5 вольт, а 10001- это 4 вольта и т. п. Дальше в схему подается как на уроках физики в школе, только чуть сложнее.

1Tima1 @1Tima1 Автор вопроса
а как там постоянно чередуется 4,5,5,5,4,5,4,4 вольта
1Tima1 @1Tima1 Автор вопроса
Griboks, последовательность разных напряжений это вообще как?

Griboks

1Tima1, ладно, я пытался помочь, но лучше вам просить почитать пару книг.

Zoominger

Griboks, вас тоже надолго не хватило? 🙂
1Tima1 @1Tima1 Автор вопроса

Рональд Макдональд, вот только не надо!
почему то,что вы уже изучаете несколько лет,я должен понять сразу!

Zoominger

1Tima1, почему то, что мы изучаем несколько лет, вы ждёте, что мы объясним в двух предложениях?
1Tima1 @1Tima1 Автор вопроса

Рональд Макдональд, а почему вы смеетесь над тем,что я хочу понять и узнать больше?
вас тоже надолго не хватило? 🙂

Zoominger

1Tima1, да никто не смеётся, просто у вас на один наш ответ сразу десять вопросов 🙂
1Tima1 @1Tima1 Автор вопроса
Рональд Макдональд, ну не сразу понял, хочу подробнее узнать
плохо что ли?!
Ответы на вопрос 4

Adamos

Есть прекрасная книжка: «Код. Тайный язык информатики».
Позволяет выкинуть из головы детские фантазии и начать изучение с реальности.

Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать

Давайте попробуем коротко:
процессор компьютера состоит из более, чем миллиона транзисторов. Они то открываются, пропуская ток (сигнал), то закрываются.
0 и 1 это значение сигнала (если так можно выразиться). 0 — сигнала нет, 1- сигнал есть.
Последовательность 1 и 0 определяет открытие и закрытие различных транзисторов.

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

Например вы вводите умножение двух чисел: 2 * 2. Пропустим компиляцию или интерпретацию в машинный код. Когда двойка становится 10 (в двоичной системе), она проходит через транзистор и в память пишутся данные. Такое происходит со всей операцией (Умножение тоже имеет своё обозначение для процессора. Это операция «И». Т.е. 10AND10 дадут в результате сигнал вида 100, что будет интерпретироваться как 4).
В итоге в ячейке памяти записывается результат 4.

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

Вот есть неплохое (достаточно простое в понимании) видео

Как работает процессор?

Кратко и доступно о том, как работает центральный процессор, регистры, память, инструкции и кэш, а также что такое УУ и АЛУ и зачем они нужны.

Инструмент проще, чем машина. Зачастую инструментом работают руками, а машину приводит в действие паровая сила или животное.

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

Процессор — это сердце/мозг любого компьютера. Его основное назначение — арифметические и логические операции, и прежде чем погрузиться в дебри процессора, нужно разобраться в его основных компонентах и принципах их работы.

Два основных компонента процессора

Устройство управления

Устройство управления (УУ) помогает процессору контролировать и выполнять инструкции. УУ сообщает компонентам, что именно нужно делать. В соответствии с инструкциями он координирует работу с другими частями компьютера, включая второй основной компонент — арифметико-логическое устройство (АЛУ). Все инструкции вначале поступают именно на устройство управления.

Существует два типа реализации УУ:

  • УУ на жёсткой логике (англ. hardwired control units). Характер работы определяется внутренним электрическим строением — устройством печатной платы или кристалла. Соответственно, модификация такого УУ без физического вмешательства невозможна.
  • УУ с микропрограммным управлением (англ. microprogrammable control units). Может быть запрограммирован для тех или иных целей. Программная часть сохраняется в памяти УУ.

УУ на жёсткой логике быстрее, но УУ с микропрограммным управлением обладает более гибкой функциональностью.

Арифметико-логическое устройство

Это устройство, как ни странно, выполняет все арифметические и логические операции, например сложение, вычитание, логическое ИЛИ и т. п. АЛУ состоит из логических элементов, которые и выполняют эти операции.

Большинство логических элементов имеют два входа и один выход.

Ниже приведена схема полусумматора, у которой два входа и два выхода. A и B здесь являются входами, S — выходом, C — переносом (в старший разряд).

Как работает процессор? 1

Схема арифметического полусумматора

Хранение информации — регистры и память

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

Регистры

Регистр — минимальная ячейка памяти данных. Регистры состоят из триггеров (англ. latches/flip-flops). Триггеры, в свою очередь, состоят из логических элементов и могут хранить в себе 1 бит информации.

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

По функциональному назначению триггеры делятся на несколько групп:

  • RS-триггер: сохраняет своё состояние при нулевых уровнях на обоих входах и изменяет его при установке единице на одном из входов (Reset/Set — Сброс/Установка).
  • JK-триггер: идентичен RS-триггеру за исключением того, что при подаче единиц сразу на два входа триггер меняет своё состояние на противоположное (счётный режим).
  • T-триггер: меняет своё состояние на противоположное при каждом такте на его единственном входе.
  • D-триггер: запоминает состояние на входе в момент синхронизации. Асинхронные D-триггеры смысла не имеют.

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

Как работает процессор? 2

Принцип действия RS-триггера

Память (ОЗУ)

ОЗУ (оперативное запоминающее устройство, англ. RAM) — это большая группа этих самых регистров, соединённых вместе. Память у такого хранилища непостоянная и данные оттуда пропадают при отключении питания. ОЗУ принимает адрес ячейки памяти, в которую нужно поместить данные, сами данные и флаг записи/чтения, который приводит в действие триггеры.

Прим. перев. Оперативная память бывает статической и динамической — SRAM и DRAM соответственно. В статической памяти ячейками являются триггеры, а в динамической — конденсаторы. SRAM быстрее, а DRAM дешевле.

Команды (инструкции)

Команды — это фактические действия, которые компьютер должен выполнять. Они бывают нескольких типов:

  • Арифметические: сложение, вычитание, умножение и т. д.
  • Логические: И (логическое умножение/конъюнкция), ИЛИ (логическое суммирование/дизъюнкция), отрицание и т. д.
  • Информационные: move , input , outptut , load и store .
  • Команды перехода: goto , if . goto , call и return .
  • Команда останова: halt .

Прим. перев. На самом деле все арифметические операции в АЛУ могут быть созданы на основе всего двух: сложение и сдвиг. Однако чем больше базовых операций поддерживает АЛУ, тем оно быстрее.

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

В процессоре инструкции реализуются на аппаратном уровне. За один такт одноядерный процессор может выполнить одну элементарную (базовую) инструкцию.

Группу инструкций принято называть набором команд (англ. instruction set).

Тактирование процессора

Быстродействие компьютера определяется тактовой частотой его процессора. Тактовая частота — количество тактов (соответственно и исполняемых команд) за секунду.

Частота нынешних процессоров измеряется в ГГц (Гигагерцы). 1 ГГц = 10⁹ Гц — миллиард операций в секунду.

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

Выполнение инструкций

Инструкции хранятся в ОЗУ в последовательном порядке. Для гипотетического процессора инструкция состоит из кода операции и адреса памяти/регистра. Внутри управляющего устройства есть два регистра инструкций, в которые загружается код команды и адрес текущей исполняемой команды. Ещё в процессоре есть дополнительные регистры, которые хранят в себе последние 4 бита выполненных инструкций.

Ниже рассмотрен пример набора команд, который суммирует два числа:

  1. LOAD_A 8 . Это команда сохраняет в ОЗУ данные, скажем, . Первые 4 бита — код операции. Именно он определяет инструкцию. Эти данные помещаются в регистры инструкций УУ. Команда декодируется в инструкцию load_A — поместить данные 1000 (последние 4 бита команды) в регистр A .
  2. LOAD_B 2 . Ситуация, аналогичная прошлой. Здесь помещается число 2 ( 0010 ) в регистр B .
  3. ADD B A . Команда суммирует два числа (точнее прибавляет значение регистра B в регистр A ). УУ сообщает АЛУ, что нужно выполнить операцию суммирования и поместить результат обратно в регистр A .
  4. STORE_A 23 . Сохраняем значение регистра A в ячейку памяти с адресом 23 .

Вот такие операции нужны, чтобы сложить два числа.

Шина

Все данные между процессором, регистрами, памятью и I/O-устройствами (устройствами ввода-вывода) передаются по шинам. Чтобы загрузить в память только что обработанные данные, процессор помещает адрес в шину адреса и данные в шину данных. Потом нужно дать разрешение на запись на шине управления.

Кэш

У процессора есть механизм сохранения инструкций в кэш. Как мы выяснили ранее, за секунду процессор может выполнить миллиарды инструкций. Поэтому если бы каждая инструкция хранилась в ОЗУ, то её изъятие оттуда занимало бы больше времени, чем её обработка. Поэтому для ускорения работы процессор хранит часть инструкций и данных в кэше.

Если данные в кэше и памяти не совпадают, то они помечаются грязными битами (англ. dirty bit).

Поток инструкций

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

Однако такое решение подходит только для тех инструкций, которые не зависят друг от друга.

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

Из чего состоит центральный процессор?

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

Этот текст входит в серию статей, в которых тщательно разбирается работа ключевых компонентов компьютера. Кроме того, если вы заинтересовались темой, рекомендуем ознакомиться с переводами статей серии «Как разрабатываются и создаются процессоры?».

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

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

Фундамент любого процессора: архитектура набора команд

Первое, на что натыкаешься при разборе любого процессора — это на архитектуру набора команд (ISA). Архитектура является чем-то вроде фундамента работы процессора и именно от нее зависит то, как он работает и как все внутренние системы взаимодействуют друг с другом. Существует огромное количество архитектур, но самыми распространенными являются x86 (преимущественно в стационарных компьютерах и ноутбуках) и ARM (в мобильных устройствах и встроенных системах).

Чуть менее распространенными и более нишевыми являются MIPS, RISC-V и PowerPC. Архитектура набора отвечает за ряд основных вещей: какие инструкции процессор может обрабатывать, как он взаимодействует с памятью и кэшем, как задача распределяется по нескольким этапам обработки и др.

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

Блок управления и исполнительный тракт

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

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

Блок-схема работы базового процессора. Черными линиями отображен поток данных, а красными — поток команд.

Цикл выполнения команд — Выборка

Первое, что должен сделать процессор — определить, какие команды необходимо выполнить следующими, а затем переместить их из памяти в блок управления. Команды создаются компилятором и зависят от архитектуры набора (ISA). Наиболее распространенные типы базовых инструкций (например, «загрузка», «хранение», «сложение», «вычитание» и др.) общие для всех ISA, но существует множество дополнительных, специальных типов команд, уникальных для конкретной архитектуры набора. Блок управления знает, какие сигналы и куда нужно направить для выполнения определенного типа команды.

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

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

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

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

Стоит отметить, что сложность декодирования может зависеть от того, насколько продвинутой является архитектура набора команд процессора. У архитектуры RISC-V, к примеру, несколько десятков команд, а у x86 — несколько тысяч. У типичного процессора Intel x86 процесс декодирования является одним из сложнейших и занимает огромное количество памяти. Чаще всего процессоры декодируют команды, связанные с памятью, арифметическими вычислениями и переходом.

3 основных типа команд

Команда памяти может представлять собой нечто вроде «прочтите значение из адреса памяти 1234 вместо значения А» или «запишите значение Б в адрес памяти 5678». Арифметические команды имеют вид в духе «добавьте значение А к значению Б и сохраните результат в значении В». Инструкции перехода, в свою очередь, похожи на «выполните этот код, если значение В положительное, или выполните другой код, если значение В отрицательное». Зачастую в программах используется цепочка сразу из нескольких вышеупомянутых примеров, из-за чего конечный результат выглядит примерно так: «добавьте значение адреса памяти 1234 к значению адреса памяти 5678 и сохраните его в адресе памяти 4321, если результат положительный, либо в адрес 8765, если результат отрицательный».

Перед тем, как перейти к выполнению декодированной команды, давайте уделим немного внимания регистрам.

Регистрами называются немногочисленные, но крайне быстрые фрагменты памяти процессора. У 64-битных процессоров каждый из них вмещает 64 бита, а всего их может быть несколько десятков на одно ядро. Регистры используются для хранения используемых в данный момент значений и их можно считать чем-то вроде кэша нулевого уровня. В приведенных выше примерах команд значения А, Б и В будут сохранены именно в регистре.

Арифметико-логическое устройство

Вернемся к этапу выполнения команд. Сразу отметим, что он отличается для всех трех вышеупомянутых типов команд, поэтому давайте рассмотрим каждый их них.

Самыми простыми для понимания являются арифметические команды. Эти команды отправляются в арифметическо-логическое устройство (ALU) для последующей обработки. Устройство представляет собой цепь, которая чаще всего работает с двумя значениями, отмеченными сигналом, и выдает результат.

Представьте себе обычный калькулятор. Для любого вычисления вы вводите значения, выбираете необходимую арифметическую операцию и получаете результат. Арифметическо-логическое устройство (ALU) работает по похожему принципу. Тип операции зависит от опкода команды, который управляющий автомат отправляет в ALU и которое в дополнение к базовой арифметике может производить со значениями такие битовые операции, как AND, OR, NOT и XOR. Кроме того, арифметическо-логическое устройство выводит информацию о проведенном вычислении для управляющего автомата (например, оказалось ли оно положительным, отрицательным, равным нулю или вызвало переполнение).

Несмотря на то, что арифметическо-логическое устройство чаще всего связано именно с арифметическими операциями, оно находит свое применение и в инструкциях памяти или перехода. Например, если процессору нужно вычислить адрес памяти, заданный в результате прошлого вычисления, либо в случае необходимости вычислить переход для добавления в счетчик программ, если инструкция того требует (пример: «если предыдущий результат отрицателен, перейти на 20 команд вперед»).

Команды и иерархия памяти

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

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

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

Команды перехода и ветвления

Последняя из трех основных типов команд — это команда ветвления. Команды современных программ постоянно переходят с одного потока процессов на другой, а это значит, что процессор крайне редко выполняет более дюжины смежных команд без перехода. Команды ветвления происходят от элементов программирования, таких как код IF, FOR и RETURN. Все они используются для прерывания выполнения программы или переключения на другую часть кода. Кроме команд ветвления существуют и команды перехода, которые отличаются от первых тем, что они всегда участвуют в процессе выполнения программы.

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

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

Самой простой аналогией будет процесс стирки. Предположим, что у вас достаточно вещей на две полные загрузки стиральной машины, а стирка и сушка каждой партии занимает по часу. Вы вполне можете загрузить в стиральную машину первую партию вещей, а потом переместить на сушилку, а когда они высохнут — заняться второй партией. Это займет четыре часа. Однако, если вы разделите процесс на этапы и начнете стирку второй партии вещей, пока сушится первая, вы сможете выполнить всю работу за три часа. Сокращение времени зависит от количества загружаемых вещей и количества стиральных/сушильных машин. Для выполнения отдельной загрузки в любом случае понадобится два часа, но в приведенном примере накладывание процессов увеличивает общую пропускную способность с 0,5 загрузки/час до 0,75 загрузки в час.

Графическое представление конвейера, используемого в ядрах процессоров AMD Bobcat (2011). Обратите внимание, как много в нем различных элементов и стадий.

Процессоры используют тот же принцип для повышения пропускной способности команд. Конвейеры современных процессоров на архитектуре ARM или x86 могут использовать свыше 20 стадий вычислительного конвейера, а это значит, что ядро процессора одновременно обрабатывает свыше 20 различных команд. Процессоры могут отличаться по разделению этих стадий под различные нужды, но в одном из примеров, принцип работы которого находится в открытом доступе, имеется 4 цикла для выборки, 6 циклов для декодирования, 3 цикла для выполнения команд и 7 циклов для отправки результатов в память.

Возвращаясь к теме, теперь вы можете понять в чем проблема. Если процессор не определил тип команды до десятого цикла, то он начнет работу уже над 9 новыми командами, которые могут оказаться ненужными, если ветка команд уже не работает. Чтобы этого не происходило, процессоры оборудованы сложным механизмом, который называется модулем предсказателем переходов. По принципу работы этот механизм схож с машинным обучением. Детальное описание работы модуля предсказателя переходов — это тема для отдельной статьи, поэтому придется обойтись довольно простым объяснением: данный механизм отслеживает статус предыдущих переходов, чтобы определить, будет ли задействован следующий переход или нет. Современные предсказатели переходов могут обеспечить точность в 95% и выше.

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

Внеочередное исполнение

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

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

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

Ускорители и будущее процессоров

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

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

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

Кристалл процессора Intel первого поколения архитектуры Nehalem. Обратите внимание: ядра и кэш занимают подавляющее часть площади.

Кристалл системы на чипе от AMD. Много места отведено под ускорители и внешние интерфейсы.

Многоядерность

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

В случае с четырьмя ядрами процессору необходимо отправлять команды в 4 раза быстрее. Также нужно четыре раздельных интерфейса для памяти. Именно из-за наличия нескольких ядер на одном чипе, потенциально работающих с одними и теми же частями данных, возникает проблема слаженности и согласованности их работы. Предположим, если два ядра обрабатывали команду, использующую одни и те же данные, то как процессор определяет, у которого из них правильное значение? А что, если одно ядро модифицировало данные, но они не успели вовремя дойти до второго ядра? Поскольку у них есть отдельные кэши, в которых могут храниться пересекающиеся данные, для устранения возможных конфликтов необходимо использовать сложные алгоритмы и контроллеры.

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

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

Физическая оболочка процессора

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

Для того, чтобы синхронизировать работу всех компонентов процессора, используется тактовый сигнал. Современные процессоры обычно работают на частотах от 3.0 ГГц до 5.0 ГГц, и за последнее десятилетие ситуация особо не изменилась. При каждом цикле внутри чипа включаются и выключаются миллиарды транзисторов.

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

Фото: Michael Dziedzic

Тепловыделение — главный враг процессоров. Когда цифровая электроника нагревается, может начаться разрушение микроскопических транзисторов. Это в свою очередь может привести к повреждению чипа, если тепло не отвести. Чтобы этого не произошло, каждый процессор оборудован термораспределителями. Сам кристалл может занимать всего 20% площади процессора, ведь увеличение площади позволяет более равномерно распределять тепло по радиатору. Кроме того, дополнительно увеличивается количество имеющихся ножек процессора (контактов), предназначенных для взаимодействия с другими компонентами компьютера.

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

Подытожим на примере

Чтобы подвести итоги, кратко рассмотрим архитектуру процессора Intel Core 2. Это было еще в 2006 году, поэтому некоторые детали могут быть устаревшими, но информации о новых разработках отсутствуют в публичном доступе.

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

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

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

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

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

Другие материалы по теме

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *