Pull to refresh

Comments 63

Простите, а кто-нибудь еще разделяет вашу точку зрения о том, что, вопреки своему названию, RISC — это «Архитектура с уменьшенным временем выполнения инструкций»?

Да.


Нередко слова «сокращённый набор команд» понимаются как минимизация количества инструкций в системе команд. В действительности, инструкций у многих RISC-процессоров больше, чем у CISC-процессоров.[6][7] Некоторые RISC-процессоры вроде транспьютеров фирмы INMOS (англ.) имеют наборы команд не меньше, чем, например, у CISC-процессоров IBM System/370; и наоборот — CISC-процессор DEC PDP-8 имеет только 8 основных и несколько расширенных инструкций.
На самом деле, термин «сокращённый» в названии описывает тот факт, что сокращён объём (и время) работы, выполняемый каждой отдельной инструкцией — как максимум один цикл доступа к памяти, — тогда как сложные инструкции CISC-процессоров могут требовать сотен циклов доступа к памяти для своего выполнения.[8]

https://ru.m.wikipedia.org/wiki/RISC

Здесь проблема в том, что для успешного натягивания совы на глобус сравниваются некоторые современные RISC-архитектуры с некоторыми устаревшими CISC. Либо современные полноценные RISC-процессоры с CISC-микроконтроллерами. Если сравнить процессоры одного класса, то набор команд CISC будет гораздо более сложным (complex), чем у любого сравнимого RISC. Как мининмум за счет разнообразных вариантов работы с регистрами и памятью.
При этом время выполнения одинаковых команд на процессорах RISC и CISC принципиально не отличается. Т.е. если взять подмножество команд CISC, соответствующих командам RISC, то получится, что это практически одно и то же. Только в CISC есть другое, непересекающееся с RISC подмножество команд. Именно этим они и отличаются — набором команд, а не временем их исполнения.
Вообще, это условность. Главное различие между RISC и CISC-процессорами состоит в том, что первые работают только с регистровыми операндами, а пересылка данных между регистрами и памятью осуществляется отдельными инструкциями, а вторые включают в свой набор инструкций комплексные команды с возможностью брать/сохранять операнды в память.
В итоге у RISC все равно получается сокращенный набор команд, а у CISC — сложный.
Названия остались исторически, когда действительно в RISC'ах было немного инструкций. С тех пор уже всё изменилось. Сейчас сравнивать их по количеству инструкций как-то странно — не в этом суть.
Просто разная идеология.
Я бы так не утверждал. Если взять современный CISC x86-64, вы там найдете примерно пять сотен команд, это включая все MMX, SSE и прочие расширения. Если возьмете современный RISC ARMv8, там будет вполне сравнимый набор инструкций, сотни четыре. Включая всяких монстриков, обрабатывающих SIMD-данные за кучу тактов, или считающих CRC32-код. Так что по набору и составу команд они уже не особо отличаются.
Интересно. В таком случае, он, возможно, должен быть отнесен к CISC? Просто по факту.
Несмотря на всё это, классическое свойство RISC-процессоров «команды пересылки данных из памяти/в память отделены от команд обработки данных» в ARM честно соблюдается.
Да, но если мы возьмем старичка 8080, который относится к CISC, то он имеет, если я правильно понимаю, такое же разделение.
Неа, там, несмотря на простоту процессора, всё по-честному. Вы можете сделать, например ADD A, M, и процессор вам сам затянет операнд из указанной в регистрах H и L ячейки памяти. Там нельзя указать адрес непосредственным операндом команды, но по косвенной адресации все инструкции процессора умеют тянуть данные прямо из памяти.
тут надо еще учесть методы адресации — в одних архитектурах они часть команды, в других они распределены по отдельным командам. И-за этого в первом случае их получается заметно меньше, хотя число вариаций команд с учетом адресаций получается схожим.
Необходимо иметь ввиду, что если рассматривать процессоры в контексте решаемой задачи из «реального мира», а не с точки зрения «сложить два числа», то RISC потребует большего числа инструкций для решения такой задачи в общем случае, а значит будет больше доступов к внешней памяти, следовательного и времени исполнения программы. Также возрастает и объем кода.
А там есть и обратная сторона медали. Более компактные команды RISC, в которых нет суффиксов режимов доступа к данным, занимают меньший объем в памяти. Поэтому по размеру кода есть некий паритет.
Кстати, тут есть и другие фактические ошибки. Например, «CISC — Complex Instruction Set Computer — ее особенность в увеличенных количествах действий за такт». Количество действий за такт от набора команд в общем случае не зависит вообще. Оно зависит от количества и быстродействия исполнительных устройств.
В данном случае особенность CISC в увеличенном количестве действий за инструкцию (для некоторого подмножества инструкций).

Вы правы. Добавлю в статью.

"Количество действий за такт от набора команд в общем случае не зависит вообще." - не факт. Я тут пытался придумать собственный процессор. И разложить его по тактам генератора. И с удивлением обнаружил, что это, кхм, не просто. Чисто технически, триггер срабатывает по фронту импульса (возможны варианты, я знаю). А значит, если мы хотим выполнить что-то вроде "push AX", то процесс займёт несколько тактов: "такт1 - прочитать код операции и защёлкнуть в регистре операций, декодировать, выставить разные сигналы типа адреса, такт2 - защёлкнуть данные в памяти, такт 3 - выполнить декремент указателя стека". Выполнить это за один такт, кажется, невозможно. Отсюда очевидно, что количество действий на такт напрямую зависит от набора команд. Если команда - это сложение пары чисел из памяти, то действий будет ещё больше, так как невозможно достать из памяти за один раз два разных числа.

(да-да-да, я знаю, что я опоздал на 10 лет).

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

Похоже, я немного запутался. Что мы считаем за действие? Команду? Или что-то помельче, например сложение пары регистров/запись в память?

Если мы говорим о количестве действий за команду, то очевидно, что команда не равно действие, это "что-то помельче".

Да, вы правы. Не зависит. Я почему-то считал такты на команду, а не на действие ;)

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

p.s. в целом как-то сумбурно и в одну кучу, IMHO

Про тта было сказанно мало. Согласен.


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

Уж простите, но я с критикой
И так что такое битность процессора? Многие считают, что это битность шины данных. Но это не так.Почему?

Далее можно было не писать.Почему? Потому что следующие предложения ничего не поясняют, и я как читатель чувствую себя дибилом в кругу умных.
Например для установки ножки в STM32 в высокое и низкое состояние используется разные регистры, что позволяет иметь атомарность на уровне переферии.

Тоже самое… если начинаете говорить в лицах, то как то логичнее заканчивайте мысль:
"… используются разные регистры BSRR/BSR для атомарного, и ODR для не атомарного..."
К сожалению, это не статья уровня Хабра, а компиляция из различных источников, при этом автор сам слабо понимает о чем идет речь…

Автор понимает все. Это попытка донести минимум информации о процессоре. Как я уже сказал, в дальнейшем все будет НАМНОГО подробнее.

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

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

И это нельзя списать на то что «потом будет подробнее». Потому что «подробнее» и «по-другому» не одно и то же.
Насчет кеша Вы неправы. У Вас понимание работы кеша осталось на уровне именно понимания программиста. В реализациях все немножечко по другому. Кеш имеет отдельный от ядра механизм — машину состояний грубо говоря, — но на изменение состояний этой машины воздействуют не только операции доступа к памяти.
Насчет предвыборки — в тех-же Intel с четыремя ядрами, которые Вы, как программист, видете, параллельно работает пятое ядро на предсказаниях и предвыборке, которое дает рекомендацию кешу на предпрочтение. И предсказание работает НЕ только на статистике предыдущих выборок.
Если не верите — почитайте какой-нибудь учебник по проектированию процессоров. Даже классический Харрис сойдет — его перевод кстати сейчас ДМК планируют в печатной форме выпустить…
Я не говорю о таких деталях реализации.
Суть в том, что автор не написал о том, почему кэш вообще полезен. Высокой ПСП и низкой латентности самих по себе недостаточно, нужна еще и локальность данных.
Автор пишет о предвыборке, хотя предвыборка вообще не является обязательной для кэша. И т.п.

Я специально исключил термины и названия, что бы не путать новичков. И мне надо это исправить :). Да с "почему" бред вышел. Там предложения было сокращено и несколько абзацов исчезли. Почему должен был относиться к другому предложению.

Наоборот. На правах нуба в процессорах говорю: термины нужно использовать, и пояснять их при первом появлении. Чтобы я (читатель, нуб в процессорах) сразу их запомнил и потом знал.

Обязательно учту во второй части. Просто я редко пишу для "нубов". Только набираюсь опыта :)

Как-то сумбурно и недостаточно широко. Если это всё, что вы знаете, то в лучшем случае вы придумаете какой-нибудь MIPS. Я бы добавил ещё как минимум про микрокод, delay slot-ы и стековые архитектуры.
И да, мне кажется, или PIC/PIE вообще никакого отношения к процессорным архитектурам не имеют?

В данном случае будут иметь. В дальнейшем при разработке процессора именно это повлияет на несколько инструкций

Чем плох MIPS? И да в итоге у нас будет урезанный MIPS. :)

Ничем, за исключением невероятной уникальности этой реализации.

Разрабатывал для диплома процессор необычной архитектуры, с микрокодом и перенастройкой. В шутку назвал его CSISC — Custom structure and Instruction Set Computer. Потому что его структура и набор инструкций недетерминированы изначально. Написать что ли статью? Правда, разработка велась не «в железо», сугубо на уровне блоков, для опробования самой идеи. Но есть транслятор микрокода, эмулятор самого процессора, демонстрационный микрокод под определенный набор инструкций и ассемблер для трансляции в этот машинный язык.
Да, напишите.
Когда я в своё время на дипломе предложил память и арифметику тактировать по-разному, с отсуствием ожидания готовности (синхрон, всё считано) — меня заклевали так, что пришлось почти всё переделывать… даже слова были типа «техническое хулиганство» и прочий «авантюризм» (когда получаешь недопуск к защите это, скажу я вам, оч-чень неприятно)… (просто там почти на порядок быстродействие поднять удалось на той же элементной базе по сравнению с тогдашней типовой учебной схемой, если бы вышло чуть хуже — никто б не возбудился)…
Так и создаётся впечатление, что все идеи «оттуда».
То же можно сказать и про Эльбрус, тоже VLIW, фактически последним словом и можно ограничиться.
the Crusoe runs a software abstraction layer, or a virtual machine, known as the Code Morphing Software (CMS). The CMS translates machine code instructions received from programs into native instructions for the microprocessor. In this way, the Crusoe can emulate other instruction set architectures (ISAs).

То же самое можно сказать про любую машину с микрокодом. А еще я могу вспомнить машину МИР 60х гг.
Системные вызовы используется в Операционных системах для того что бы программы могли общаться с операционной системой например просить ОС прочитать файл. Очень похоже на прерывания. Аналогично исключениям не всегда присутствуют в процессоре

Это сущность уровня ОС. Иногда в наборе инструкций есть специальный(е) опкод(ы) для большего удобства (типа svc в arm), которые порождают event и, соответственно, прерывание как реакцию на него. Но говорить, что системные вызовы есть на уровне процессора как-то странно.


В таком режиме программа или ОС имеют полный доступ к памяти в обход MMU/MPU.

Привилегированный режим не означает отключение MMU и MPU, они могут управляться в этом режиме (не всегда, иногда может производиться блокировка MPU после его конфигурации и следующий раз можно конфигурировать только после reset'а; не знаю есть ли такие режимы для MMU у кого-нибудь).


Что такое PIE? (PIC не использую для избежания путаницы с МК PIC). PIE это техник благодаря которому компилятор генерирует код который будет работать в любом месте в памяти. Это техника в совмещении с MPU позволяет компилировать высокие языки программирования которые будут работать и с MPU.

Высокие языки программирования — это хорошо, смешно. PIC, конечно, генерирует position independent code, который содержит ещё таблицы для загрузчика, чтобы можно было заставить этот код работать после расположения по определенному адресу. И эта функциональность предоставляется ОС. Что означает последняя фраза — мне неведомо, написано очень криво.


Пример совмещения является MIPS16 в MIPS и Thumb-I/II в ARM.

Вы thumb и thumb2 не путайте. Thumb2 поддерживает операции с 3 регистрами вида ADD Rd, Rn, <operand2> и ADD Rd, Rn, #<imm12>; <operand2> может содержать регистр с опциональным сдвигом на константу или другой регистр (типа ADD Rd, Rn, Rm, LSL #3).

И вправду там thumb 2 откуда то взялся! Сейчас исправлю.

И ошибка в PIE получилась смешная.
Кажеться вы пропустили часть чуть выше. Я чуть выше описал, что оно не всегда присутсвует.

U, the 'User/Supervisor' bit, controls access to the page based on privilege level. If the bit is set, then the page may be accessed by all; if the bit is not set, however, only the supervisor can access it. For a page directory entry, the user bit controls access to all the pages referenced by the page directory entry. Therefore if you wish to make a page a user page, you must set the user bit in the relevant page directory entry as well as the page table entry.


Из http://wiki.osdev.org/Paging.
Я имел ввиду, что можно обойти MPU и использовать память предназначенную только для супервизора.

Так и не понял что там с «разрядностью процессора», всегда считал что это размер регистра общего назначения. Поправьте. И конечно продолжайте интересно!
Почему? Потому что нельзя создать унивирсальную архитектуру.

Как раз на возможности создать универсальную архитектуру базируется всё ИТ, если Тьюринг вам о чём-то говорит. Возможно имелась ввиду оптимальность?
Хотел написать ещё кучу комментариев, например про то, что упомниается гарвардская архитектура и кеш, но никаких параллелей не проводится, хотя в современных архитектурах кеш имеет несколько уровней именно потому что один из уровней это кеш данных и кеш инструкций — отдельно. Пишется про endian, но ничего не говорится про то как это влияет на вычисления, упоминается атомарность, но нет никаого контекста с многоядерностью и общим доступом к одним и тем же данным и соотвествующие инструкции (там их 4 всего можо привести), есть про битность, но нет про аккумуляторы и адресацию, в принципе, про SIMD с одним тактом вообще убило. Я бы характеризовал как: статья обо всём и — ни о чём. Скорее это черновик «о чём бы я сам хотел узнать и разобраться»

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


Кеш и Гарвард связанны, но когда мы будем создавать свой процесор кеша не будет. Поэтому здесь много моментов пропущенно.


Про многоядерность будет во второй части.


Акумуляторы в современных процессорах не используеться.


Скорее "Чтобы я хотел, чтобы читающий знал до перехода к практике".


Спасибо за замечания!

Reduced Instruction Set Computer — Архитектура с уменьшенным временем выполнения инструкций


Штоэээа?
Аразве не архитектура с «упрощённым набором инструкций» (буквально)?

CISC — Complex Instruction Set Computer — ее особенность в увеличенных количествах действий за такт.


Штоэээа?
Прям таки «за такт», а не за машинный цикл?
И вообще, разве это не подразумевает «сложные инструкции», с «богатой семантикой»?

Архитектура фон Неймана
[...]
Особенностью таких архитектур была общая шина данных и инструкций


Штоэаа?
Фон Нейман — это архитектура с общей памятью программ и данных.
К «общей шине» она не имеет непосредственного отношения.

Большинство современных архитектур это программный фон Нейман, однако никто не запрещает делать аппаратный Гарвард.


Обожемой…

Архитектура гарварда

Harvard

Особенность этой архитектуры является отдельная шина данных и инструкций.


Гарвардская архитектура имеет раздельную память программ и данных.
Легче реализуется.
Микропрограммные устройства практически автоматом реализуются в гарвардсткой архитектуре.
Может эмулировать архитектуру фон Неймана — изображая из себя «микроядро» и реализуя его функциональность при соотв. аппаратной поддержке.

Что такое конвейеры? Если сказать очень глупым языком это несколько параллельных действий за один такт.


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

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

Используется в связке с Masked Execution.


Ойфто? 0_0

Идут множество споров насчет того сколько должно быть операндов в арифметических инструкциях. Например в MIPS используется вариант с 3-мя регистрами. 2 операнда, 1 регистр записи.


Это, вообще говоря, следует отнести к архитектурным особенностям.
Возможна трёхадресная, двухадресная, одноадресная и безадресная системы команд.

Трёхадресная: A < — B * C, результат операции "*" между B и C помещается в регистр A, все регистры произвольно адресуемые.

Двухадресная: B < — B * C.

Одноадресная: A < — A* C, здесь A — фиксированный регистр-аккумулятор. Обычно мнемоника либо включает его, либо подразумевается — MOVA, к примеру. Возмодны одноадресные команду «просто» — инверсия операнда, к примеру.

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

И так что такое битность процессора? Многие считают, что это битность шины данных. Но это не так. Почему? В ранние переоды микроконтроллеров и микропроцессоров шина могла быть например 4-х битной но передавала пакетами по 8 бит.


Внезапно!
Первый Пентиум имел 64-битную шину данных, но 32-битное АЛУ.
В общем, с этим всё непросто — хотя чаще битность считают по АЛУ.

Атомартность операций обеспечивает потоко-независимое исполнение за счет инструкций который выполняют несколько действий за один Псевдо такт.


Атомарность — это непрерываемость исполнения.
Например, инструкция практически всегда является атомарной, бо не может быть прервана «на половине» прерыванием.

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

Shadow Registers

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

Стек? Я видел Стек в .NET и в Java! Что же. Вы частично правы. Стек существует, но он никогда не был апаратным в большинства процессорах.


М-ммм.
Что имеется в виду?
Отдельная память для стека — иле отсутствие специализированных инструкций (push/pop/call/ret) — работающих в связке со специализированным регистром-указателем стека SP?

Например в MIPS его по просту нет. Спросите КАК ТАК ТО?! Ответ прост.


«It's a BAD».
Например в действительно древних УС-ках стека тоже не было — и это не есть гуд.

Конец


Низачод.
Будь я Вашим преподом в СШ — именно такую оценку я бы Вам выставил.
Не раскрыты темы микропрограмм, АЛУ, DSP — а в остальном чрезвычайно много э-ээ, неверного.
Низачод.
  1. RISC прочитайте мой коментарий чуть выше
  2. CISC слегка подредактировал.
  3. Вы правы. Какой-то бред в итоге получился. Хотел укоротить, вынес вперед ногами весь смысл.
  4. Согласен здесь все не просто. Надо было мне больша букАв про битность. А то получилось просто небольшое опровержение мифа.
  5. Не много не понял.
  6. Shadow registers и кеш. Не вижу вашего текста.
  7. Отсутсвие инструкций. Здесь стоит не согласится. Я считаю, что инструкции PUSH и POP не нужны. Посмотрите на код генерируемый GCC он использует указатель стека для локальных переменных используя инструкции ld и st относительно указателя стека в MIPS. Я считаю MIPS эталоном RISC ядер. Хотя это сугубо личное мнение.
  8. Прочитайте текст далее. Конец ПЕРВОЙ главы нулевой части. Это не конец. Это начало (хоть и не удачное). И судить ПОКА о всей серии рано.
Гарвардская архитектура имеет раздельную память программ и данных.
Легче реализуется.
Микропрограммные устройства практически автоматом реализуются в гарвардсткой архитектуре.
Может эмулировать архитектуру фон Неймана — изображая из себя «микроядро» и реализуя его функциональность при соотв. аппаратной поддержке.

Сейчас вообще в микроконтроллерах часто применяется modified harvard, о которой автор вообще не упомянул. И modified harvard, например, позволяет читать данные из instruction memory и наоборот. Плюс часто реально используется общая память, которая разделяется на уровне i- и d-cache или соответствующих шин.

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

Ну если Вы знаете, как обрабатывать прерывания без аппаратного стека возвратов, то с нетерпением жду следующую статью.
И Вы таки правы, Ваше определение стека очень грубое и, по моему мнению, настолько грубое, что даже и неверное.
Стек? Я видел Стек в .NET и в Java! Что же. Вы частично правы. Стек существует, но он никогда не был апаратным в большинства процессорах. Например в MIPS его по просту нет. Спросите КАК ТАК ТО?! Ответ прост. Стек это просто доступ к памяти которую не нужно резервировать (очень грубое определение). Стек используется для вызова функций, передачи аргументов, сохранения регистров для того чтобы востановить их после выполнения функции и т.д.

Если она аппаратно не реализуется тогда его нужно реализовать явно для обработки(возврата к инструкциям до вызова и возврата состояния регистров) функций и прерываний?
Про ортогональные системы команд и РОН написано будет?

Хорошая статья, жду продолжения. Как раз тоже решил попробовать реализовать свой процессор на базе ПЛИС.

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

> недостатком является большое зависимости производительности процессора от шины

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

> Так же несколько инструкций в начале кода будет занято инструкциями для Таблицы прерываний.

«Инструкции для таблицы прерываний» это вектора прерываний, что ли? Тогда они обычно не инструкции, если не применён стиль i8080. Если же данный стиль — то лучше было описать в статье с реализацией прерываний.

Рекомендую тщательно вычитать и исправить.

По отдельным пунктам:

> CISC — Complex Instruction Set Computer — ее особенность в увеличенных количествах действий за инструкцию.

Основные признаки CISC:
1. Ориентация на написание ассемблерного кода человеком, или компилятором, транслирующим типичные операции ЯВУ дословно, без их переработки. Во времена слабых компиляторов (считаем, до середины 80-х) это неизбежно.
2. Как следствие (1) — стремление к ортогональности операций и адресации операндов, и предоставление средств для идиоматических действий типа «доступ по адресу, снимаемому с вершины стека».
3. Экономия памяти под инструкции. Этот признак не имеет причиной концепцию CISC, но современен ему (основные разработки шли в условиях дорогой, но быстрой памяти, сравнимо со скоростью процессора). Отсюда — обязательность разной длины инструкций.

Яркие примеры — PDP-11, VAX, M68K. Упоминать здесь x86 не совсем адекватно. У x86, например, у основного блока команд допускается не более одного операнда в памяти (исключения вроде MOVS крайне редки). В этом смысле, x86 — полу-RISC. Ещё жёстче это, например, в линии S/360...z/Arch в блоке RX-команд — в памяти только второй источник, но не первый источник, он же приёмник.

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

> Reduced Instruction Set Computer — Архитектура с уменьшенным временем выполнения инструкций (из расшифровка RISC можно подумать, что это уменьшенное количество инструкций, но это не так)

Не так, но и не по-вашему. RISC это уменьшенная сложность одной инструкции. А по второй расшифровке — Rational Instruction Set Computer — оптимизация построения на типичные применения с отбрасыванием лишнего, и на современные компиляторы с их логикой работы.
Время выполнения одной инструкции может быть в типичном случае даже выше, за счёт подъёма всех до 4-5 тактов, но это компенсируется простотой построения параллельного исполнения.

> Архитектура фон Неймана

Есть и другой метод называния — принстонская архитектура (а фон Неймана — общее у принстонской и гарвардской).

> У данной архитектуры большим недостатком является большое зависимости производительности процессора от шины.

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

> В x86 регистров достаточно мало.

Было мало. В современных имеем, даже считая 32-битку,
1) 8 основных (eax, ebx, ecx, edx, esp, ebp, esi, edi)
2) 8 FP или MM
3) 8 XMM/YMM/ZMM
4) 8 предикатных (K0-K7) (AVX512)
и значительную часть целочисленных операций можно использовать на них всех, и тем более эти регистры можно применять для временного сохранения значений без доступа к памяти.
В 64 битах добавляется ещё 8 основных и 8 XMM/YMM/ZMM. Это уже больше, чем 32.

Пока остановился. Ещё раз сводное — в таком виде статья просто бесполезна. Лучше всё описанное вводить постепенно, и на реальных примерах. Потом, после всего цикла, уже можно сделать что-то похожее на эту статью в качестве резюме, но тогда и формулировки каждого пункта будут совсем другими.
Sign up to leave a comment.

Articles