Процессоры x86 и ARM — в чём разница?

Рань­ше было так: есть мощ­ные про­цес­со­ры для настоль­ных ком­пью­те­ров, ноут­бу­ков и сер­ве­ров, а есть сла­бые про­цес­со­ры для мобиль­ных устройств — теле­фо­нов и планшетов.

Теперь ситу­а­ция меня­ет­ся: мобиль­ные про­цес­со­ры посте­пен­но обго­ня­ют настоль­ные, а настоль­ные начи­на­ют заим­ство­вать тех­но­ло­гии из мобильных. 

Мы уже писа­ли о тех­но­ло­ги­че­ском про­ры­ве про­цес­со­ров Apple M1. Пора рас­крыть эту тему глубже. 

RISC — простые команды, много кода

На заре про­цес­со­ров у про­грам­ми­стов не было язы­ков высо­ко­го уров­ня, напри­мер JavaScript или Python. Все коман­ды писа­лись машин­ным кодом или на ассем­бле­рах. Про­грам­мист в то вре­мя рабо­тал с про­цес­со­ром напря­мую, и каж­дая коман­да в коде обо­зна­ча­ла какую-то инструк­цию для процессора.

Напри­мер, типич­ная про­грам­ма того вре­ме­ни по умно­же­нию одно­го чис­ла на дру­гое мог­ла выгля­деть для про­цес­со­ра так:

  1. Выде­ли память под пер­вое число.
  2. Запи­ши в это место пер­вое число.
  3. Выде­ли память под вто­рое число.
  4. Запи­ши в память вто­рое число.
  5. Поставь еди­ни­цу в такой-то слу­жеб­ный регистр.
  6. Выпол­ни коман­ду бито­во­го сдви­га для пер­во­го числа.
  7. (мно­го дру­гих команд)
  8. Вер­ни слу­жеб­ный регистр в состо­я­ние «0».
  9. Выде­ли память под результат 
  10. Резуль­тат умно­же­ния поло­жи на это место.

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

Такую тех­но­ло­гию назва­ли RISC — Reduced-instruction-set Computing, ком­пью­тер с огра­ни­чен­ным набо­ром команд. 

Неко­то­рое вре­мя спу­стя тех­но­ло­гию RISC усо­вер­шен­ство­ва­ли дву­мя раз­ны­ми спо­со­ба­ми — так появи­лись архи­тек­ту­ры x86 и ARM. Пер­вые ори­ен­ти­ро­ва­лись на мощ­ные ком­пью­те­ры, вто­рые — на неболь­шие устрой­ства с пони­жен­ным энергопотреблением.

x86 — это сложный RISC

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

Тогда ком­па­ния Intel выпу­сти­ла про­цес­сор 8086, кото­рый под­дер­жи­вал мно­го новых команд. Они упро­ща­ли напи­са­ние кода, частич­но закры­вая раз­рыв меж­ду машин­ным кодом и высо­ко­уров­не­вым язы­ком программирования. 

Возь­мём тот же при­мер кода для пере­мно­же­ния двух чисел. Для про­цес­со­ра 8086 код выгля­дел так:

  1. Возь­ми пер­вое и вто­рое число.
  2. Пере­множь их, а резуль­тат поло­жи в новый уча­сток памяти.

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

Такая тех­но­ло­гия назы­ва­ет­ся CISC — complex instruction set computer, вычис­ли­тель­ная маши­на со слож­ным набо­ром команд. 

✅ С одной сто­ро­ны, про­грам­ми­стам теперь про­ще писать код: вме­сто трид­ца­ти инструк­ций мож­но напи­сать три, а резуль­тат будет таким же. Чем боль­ше новых слож­ных команд под­дер­жи­ва­ет про­цес­сор, тем быст­рее идёт разработка. 

❌ С дру­гой — про­цес­со­ру теперь нуж­но тра­тить неко­то­рое вре­мя на пере­вод слож­ных команд в про­стые. Когда он полу­ча­ет от про­грам­ми­ста коман­ду «Пере­множь эти два чис­ла», то пре­вра­ща­ет её в те самые трид­цать строк кода и выпол­ня­ет каж­дую команду.

После про­цес­со­ра 8086 вышли про­цес­со­ры 80286 и 80386. Они полу­чи­лись настоль­ко удач­ны­ми для того вре­ме­ни, что с тех пор Intel мар­ки­ров­ку всех сво­их основ­ных про­цес­со­ров закан­чи­ва­ла на «86», а тех­но­ло­гия и набор команд полу­чи­ли назва­ние «x86». 

ARM — это продвинутый RISC

По дру­го­му пути пошла ком­па­ния ARM, назва­ние кото­рой рас­шиф­ро­вы­ва­ет­ся как «Улуч­шен­ные RISC-машины». Под­ход был такой: зачем нуж­но мно­го слож­ных коман­ды для про­цес­со­ра, если мож­но по мак­си­му­му исполь­зо­вать про­стей­шие коман­ды и сосре­до­то­чить­ся на эффек­тив­но­сти работы?

В ито­ге ARM усо­вер­шен­ство­ва­ли RISC-архитектуру, сде­ла­ли коман­ды про­ще и сосре­до­то­чи­лись на эффективности. 

В те вре­ме­на ARM-процессоры рабо­та­ли не так быст­ро, как про­цес­со­ры семей­ства x86, зато они потреб­ля­ли гораз­до мень­ше энер­гии. Со вре­ме­нем это поз­во­ли­ло исполь­зо­вать ARM-процессоры в мобиль­ных телефонах.

Получается, процессоры отличаются тем, что x86 это CISC, а ARM — это RISC?

Боль­шин­ство дума­ет имен­но так, и в каком-то смыс­ле это похо­же на прав­ду. Но это не совсем точно. 

Совре­мен­ные x86-процессоры на 80% состо­ят из RISC-модулей, кото­рые обра­ба­ты­ва­ют RISC-команды. Каж­дая слож­ная CISC-команда спе­ци­аль­ным деко­де­ром раз­би­ва­ет­ся на мно­го про­стых команд, кото­рые и выпол­ня­ют эти модули. 

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

В чём успех ARM

Что­бы сде­лать про­цес­сор с x86-архитектурой, ком­па­нии нуж­но самой при­ду­мать и нари­со­вать все тран­зи­сто­ры и соеди­не­ния меж­ду ними. Это слож­ный и доро­гой про­цесс, кото­рый не могут себе поз­во­лить малень­кие ком­па­нии. Из круп­ных про­из­во­ди­те­лей x86-процессоров оста­лись толь­ко Intel и AMD.

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

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

Сей­час на ARM свои про­цес­со­ры выпус­ка­ют Samsung, Nvidia, Qualcomm, Atmel, Huawei и мно­гие дру­гие. Если вы про­из­во­ди­тель смарт­фо­нов, вы може­те раз­ра­бо­тать свой соб­ствен­ный про­цес­сор на ARM, а може­те купить гото­вый у любой дру­гой ком­па­нии. Это созда­ёт кон­ку­рен­цию на рын­ке, гон­ку тех­но­ло­гий и все­об­щий прогресс. 

Главное — внутреннее устройство процессора

Совре­мен­ные про­цес­со­ры состо­ят из мно­же­ства отдель­ных моду­лей, каж­дый из кото­рых дела­ет что-то своё, например:

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

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

Текст:

Миха­ил Полянин

Редак­ту­ра:

Мак­сим Ильяхов

Худож­ник:

Даня Бер­ков­ский

Кор­рек­тор:

Ири­на Михеева

Вёрст­ка:

Мария Дро­но­ва

Соц­се­ти:

Олег Веш­кур­цев