Фактопедия

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

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

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

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

Из чего сделан процессор

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

Транзистор устроен просто: есть три вывода, и напряжение на одном из них (затворе) решает, потечёт ли ток между двумя другими. Подали нужное напряжение - канал открылся, ток идёт. Убрали - канал закрылся. По сути это тот же выключатель света, только он размером в несколько нанометров и переключается миллиарды раз в секунду без износа.

На кристалле современного процессора умещаются миллиарды таких транзисторов. Для сравнения: первый серийный микропроцессор, выпущенный в начале 1970-х годов, содержал около 2300 транзисторов - тогда это было прорывом, сейчас такое количество можно найти в отдельном узле современного чипа размером с булавочную головку. Рост плотности транзисторов на кристалле десятилетиями был главным способом наращивать вычислительную мощность, не увеличивая при этом сам чип.

Как переключатели превращаются в вычисления

Один транзистор умеет немногое - пропускать ток или не пропускать. Но если соединить несколько транзисторов особым образом, получится логический вентиль: схема, которая по входным сигналам выдаёт один выходной. Базовых вентилей немного - «И», «ИЛИ», «НЕ» и их комбинации, - но из них, как из кирпичей, собирают любую цифровую схему, вплоть до целого процессора.

Все данные внутри чипа представлены двумя состояниями - условным нулём и условной единицей, то есть отсутствием и наличием напряжения на проводнике. Число, буква, цвет пикселя на экране, нота в аудиофайле - всё это в конечном счёте цепочка нулей и единиц, а логические вентили умеют такие цепочки складывать, сравнивать и сдвигать. Сложение двух многоразрядных двоичных чисел, например, собирается из цепочки одинаковых блоков-сумматоров: каждый берёт два бита и бит переноса от соседа справа, а взамен выдаёт бит результата и перенос налево, ровно как при сложении столбиком на бумаге.

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

Что происходит за один такт

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

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

Программный счётчик - специальный регистр внутри процессора - всегда хранит адрес следующей команды. После обычного выполнения он просто увеличивается на единицу, а при условном переходе (если в программе есть проверка «если… то…») в него записывается совсем другой адрес - так процессор «прыгает» по коду, а не читает его подряд, как книгу.

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

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

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

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

Зачем процессору несколько ядер

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

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

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

Кэш - память под рукой у процессора

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

Устроено это как рабочий стол, полка и шкаф в одной комнате. Самый маленький и самый быстрый уровень (кэш первого уровня) - это буквально рабочий стол, на котором лежат данные, нужные прямо сейчас; он встроен в каждое ядро отдельно. Уровнем ниже - более просторная, но чуть менее быстрая полка, тоже часто своя для каждого ядра. Ещё ниже - общий для всех ядер шкаф, который больше по объёму, но медленнее полки. И только если нужных данных нет ни на столе, ни на полке, ни в шкафу, процессор идёт в другую комнату - к оперативной памяти, а это ощутимая по меркам процессора задержка.

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

Как процессор связан с остальным компьютером

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

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

Физически процессор устанавливается в специальный разъём - сокет, где сотни или тысячи контактов обеспечивают одновременно и питание, и передачу сигналов. Именно через эти контакты течёт ток, который заставляет транзисторы внутри кристалла переключаться, и именно по ним процессор получает команды и данные для очередного цикла вычислений.

Разные процессоры для разных задач

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

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

Почему процессоры греются

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

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

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