HTG пояснює: як насправді працює процесор?

Більшість речей у комп'ютері відносно прості для розуміння: оперативна пам'ять, пам'ять, периферійні пристрої та програмне забезпечення працюють разом, щоб змусити комп'ютер функціонувати. Але серце вашої системи, процесор, здається чарівним навіть багатьом технічним фахівцям. Тут ми зробимо все можливе, щоб зламати його.

Велика частина досліджень для цієї статті написана Дж. Кларком Скоттом «Але як це дізнатися?». Це фантастичне читання, воно набагато глибше, ніж ця стаття, і варте того, щоб заплатити пару доларів на Amazon.

Перш ніж ми почнемо, відзначимо: сучасні процесори на кілька порядків складніші, ніж ми тут описуємо. Для однієї людини практично неможливо зрозуміти кожен нюанс мікросхеми з більш ніж мільярдом транзисторів. Тим не менш, основні принципи того, як все це поєднується, залишаються незмінними, і розуміння основ дасть вам краще розуміння сучасних систем.

Починаючи з малого

Комп'ютери працюють у двійковому форматі. Вони розуміють тільки два статки: увімкнено і вимкнено. Для виконання розрахунків у двійковому форматі вони використовують так званий транзистор. Транзистор дозволяє струму джерела текти через нього в стік тільки при наявності струму на затворі. По суті, це формує двійковий перемикач, який відключає дріт залежно від другого вхідного сигналу.

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

Логічні ворота

Правильно складіть кілька транзисторів, і ви отримаєте так звані логічні елементи. Логічні елементи беруть два двійкових входи, виконують над ними операцію і повертають вихід. Наприклад, вентиль OR повертає true, якщо будь-який з входів має значення true. Логічний елемент І перевіряє, чи є обидва входи істинними, XOR перевіряє, чи є справжнім тільки один із входів, а N-варіанти (NOR, NAND і XNOR) є інвертованими версіями своїх базових вентилів.

Математика з воротами

Всього з двома воротами ви можете зробити базове двійкове додавання. На цій діаграмі вище показано половинний сумматор, створений за допомогою безкоштовного онлайн-майданчика для логічних воріт Logicly. Гейт XOR тут включиться, якщо ввімкнено тільки один з входів, але не обидва. Вентиль AND увімкнеться, якщо обидва входи увімкнені, але залишиться вимкненим, якщо немає входу. Таким чином, якщо обидва ввімкнені, XOR залишається вимкненим, і вентиль AND вмикається, отримуючи правильну відповідь з двох:

Це дає нам просте налаштування з трьома різними виходами: нуль, один і два. Але один біт не може зберігати нічого більше 1, і ця машина не надто корисна, оскільки вирішує тільки одне з найпростіших математичних завдань. Але це тільки наполовину сумматор, і якщо ви з'єднаєте два з них з іншим входом, ви отримаєте повний сумматор:

Повний сумматор має три входи - два числа для додавання і «перенесення». Перенесення використовується, коли кінцеве число перевищує те, що може бути збережено в одному біті. Повні сумматори будуть зв'язані в ланцюжок, і перенесення передається від одного сумматора до наступного. Перенесення додається до результату гейту XOR в першій половині сумматору, і є додатковий вентиль АБО для обробки обох випадків, коли це необхідно.

Коли обидва входи ввімкнено, перенесення вмикається і відправляє його наступному повному сумматору в ланцюжку:

І це приблизно так само складно, як додавання. Перехід до більшої кількості битів по суті означає просто більш повні сумматори в більш довгому ланцюжку.

Більшість інших математичних операцій може бути зроблено з доповненням; множення - це просто повторне додавання, віднімання може бути зроблено з деякою химерною інверсією біта, а ділення - просто повторне віднімання. І хоча всі сучасні комп'ютери мають апаратні рішення для прискорення більш складних операцій, технічно ви можете зробити все це за допомогою повного сумматора.

Автобус і пам'ять

Зараз наш комп'ютер - не більш ніж поганий калькулятор. Це тому, що він нічого не пам'ятає і нічого не робить зі своїми виходами. Показаний вище комірка пам'яті, яка може зробити все це. Під кришкою використовується безліч вентилів NAND, і в реальному житті вони можуть сильно відрізнятися залежно від техніки зберігання, але його функція однакова. Ви даєте йому деякі вхідні дані, вмикаєте біт «записи», і він зберігатиме вхідні дані всередині комірки. Це не просто комірка пам'яті, оскільки нам також потрібен спосіб читання інформації з неї. Це робиться за допомогою активатора, який являє собою набір логічних елементів І для кожного біта в пам'яті, всі вони пов'язані з іншим входом, битом «читання». Біти запису і читання також часто називають «встановити» і «включити».

Весь цей пакет упакований у так званий регістр. Ці регістри підключені до шини, яка являє собою пучок дротів, що проходять навколо всієї системи, підключених до кожного компонента. Навіть сучасні комп'ютери мають шину, хоча вони можуть мати кілька шин для підвищення продуктивності багатозадачності.

Кожен регістр все ще має біт запису і читання, але в цьому налаштуванні ввід і висновок - одне і те ж саме. Це насправді добре. Наприклад. Якщо ви хочете скопіювати вміст R1 в R2, ви б увімкнули біт читання для R1, який висуне вміст R1 на шину. Поки біт читання увімкнено, вам слід увімкнути біт для R2, який буде копіювати вміст шини у R2.

Регістри також використовуються для створення оперативної пам'яті. ОЗУ часто розташовується у вигляді сітки з проводами, що йдуть у двох напрямках:

Декодери беруть двійковий вхід і включають відповідний пронумерований дріт. Наприклад, «11» - це 3 у двійковому вигляді, найстарше 2-бітне число, тому декодер включить найвищий дріт. На кожному перехресті є регістр. Всі вони підключені до центральної шини і до центрального входу запису і читання. Як читання, так і запис будуть включатися тільки в тому випадку, якщо два дроти, які перетинають регістр, також включені, ефективно дозволяючи вам вибрати регістр для запису і читання. Знову ж таки, сучасна оперативна пам'ять набагато складніша, але це налаштування все ще працює.

Годинник, Степер і Декодер

Регістри використовуються повсюдно і є основним інструментом для переміщення даних і зберігання інформації в ЦП. Так, що говорить їм, щоб перемістити речі?

Годинник є першим компонентом в ядрі ЦП і буде вимикатися і вмикатися через заданий інтервал, вимірюваний в герцах або циклах в секунду. Це швидкість, яку ви бачите рекламованою разом з процесорами; Чіп 5 ГГц може виконувати 5 мільярдів циклів на секунду. Тактова частота часто є дуже хорошим показником швидкості процесора.

Годинник має три різні стани: базові години, години включення та встановлені години. Базові години буде увімкнено протягом половини циклу і вимкнено для іншої половини. Годинник включення використовується для включення регістрів і повинен бути включений довше, щоб переконатися, що дані включені. Вказані години завжди повинні бути включені одночасно з годинами включення, інакше можуть бути записані неправильні дані.

Годинник підключено до степера, який буде відраховувати від одного до максимального кроку і скидати себе назад на один, коли це буде зроблено. Годинник також підключено до вентиль AND для кожного регістру, в який ЦП може записувати:

Ці логічні елементи І також підключені до виходу іншого компонента, декодера команд. Декодер команд приймає інструкцію типу «SET R2 TO R1» і декодує її у щось, що може зрозуміти процесор. Він має власний внутрішній регістр, званий «регістр інструкцій», в якому зберігається поточна операція. Як саме це відбувається, залежить від системи, в якій ви працюєте, але як тільки вона буде декодована, вона включить правильний набір і активує біти для правильних регістрів, які спрацюють відповідно до годинника.

Програмні інструкції зберігаються в ОЗП (або кеш-пам'яті L1 в сучасних системах, ближче до ЦП). Оскільки дані програми зберігаються в регістрах, як і будь-яка інша змінна, їм можна на льоту маніпулювати, щоб переміщатися по програмі. Так програми отримують свою структуру за допомогою циклів і операторів if. Інструкція переходу встановлює поточне місце розташування в пам'яті, з якого зчитується декодер команд, в інше місце.

Як все це відбувається разом

Тепер наше спільне спрощення роботи ЦП завершено. Основна шина охоплює всю систему і підключається до всіх реєстрів. Повні сумматори разом з купою інших операцій упаковуються в Арифметичний Логічний Блок або АЛУ. Цей ALU буде мати з'єднання з шиною, а також матиме свої власні регістри для зберігання другого номера, на якому він працює.

Для виконання розрахунку дані програми завантажуються з оперативної пам'яті системи в секцію управління. Секція керування зчитує два числа з ОЗП, завантажує перше в регістр команд АЛУ, а потім завантажує друге в шину. Між тим, він відправляє ALU код інструкції, який вказує, що робити. Потім АЛУ виконує всі обчислення і зберігає результат в іншому регістрі, з якого ЦБ може зчитувати дані, а потім продовжує процес.