Skip to content

CPU

Материал проходит ревью.

НовичокФундамент ~25 мин

Границы темы

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

Пока не разбираем: устройство транзисторов, сложный внутренний параллелизм и оптимизацию под конкретную модель процессора.

Статья опирается на простой цикл команд из материала «Архитектура фон Неймана».

Результаты обучения

После статьи читатель сможет:

  1. объяснить работу CPU без фразы «это мозг компьютера»;
  2. отличить процессор от ядра;
  3. рассказать, зачем нужны регистры и кеш;
  4. назвать несколько факторов скорости программы;
  5. провести простое измерение CPU-нагрузки.

Основная модель

CPU выполняет машинные команды программы. Команды делают небольшие действия:
  • загружают значение;
  • складывают или сравнивают числа;
  • сохраняют результат;
  • переходят к другой команде.
Диаграмма

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

Основные термины

ТерминПростое определение
CPU, процессорКомпонент, выполняющий машинные команды
ЯдроЧасть CPU, способная выполнять свой поток команд
ПотокПоследовательность выполняемой работы
ТактОдин шаг внутреннего ритма процессора
ЧастотаКоличество тактов в секунду
РегистрОчень маленькое и быстрое хранилище внутри ядра
КешБыстрая копия недавно или часто нужных данных

Один физический процессор может содержать много ядер. Операционная система распределяет программные потоки между ними.

End-to-end сценарий

Снова сложим 20 и 22, но теперь посмотрим именно на CPU:

text
1. Загрузить 20 в регистр A
2. Загрузить 22 в регистр B
3. Сложить A и B
4. Сохранить 42
Диаграмма

Регистры находятся внутри ядра и подходят для значений, нужных прямо сейчас. Если данных нет рядом, CPU ждёт их из кеша или RAM.

Что происходит под капотом

Ядро повторяет цикл команд

На базовом уровне ядро:

  1. получает следующую команду;
  2. определяет, что она означает;
  3. получает нужные данные;
  4. выполняет действие;
  5. сохраняет результат;
  6. переходит к следующей команде.

Реальные CPU обрабатывают части нескольких команд одновременно. Для первого знакомства достаточно последовательной модели.

Зачем нужны регистры

Получать каждое маленькое значение из RAM было бы слишком долго. Регистры находятся внутри ядра и хранят:

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

Регистров мало, поэтому программа не может держать в них все данные.

Зачем нужен кеш

Кеш находится между ядром и оперативной памятью:

text
ядро → регистры → кеш → RAM
быстрее                         медленнее
меньше                          больше

Если нужное значение уже в кеше, ядро получает его быстрее. Если нет, возникает промах кеша: данные нужно принести с более далёкого уровня.

Что дают несколько ядер

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

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

CPU может быть занят или ждать

Диаграмма

Сжатие, шифрование и обработка изображений часто требуют много CPU. Запрос к базе данных или внешнему API часто проводит часть времени в ожидании.

Минимальный воспроизводимый пример

Сравним одинаковое вычисление с разным количеством повторов:

bash
time node -e 'let sum = 0; for (let i = 0; i < 10_000_000; i++) sum += i; console.log(sum)'
time node -e 'let sum = 0; for (let i = 0; i < 100_000_000; i++) sum += i; console.log(sum)'

Ожидаемый результат

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

Команда time обычно показывает:

text
real  ...   # сколько времени прошло
user  ...   # сколько времени CPU выполнял код процесса
sys   ...   # сколько времени CPU работал в ОС для процесса

Для этого вычислительного примера user составляет заметную часть real.

Как диагностировать ошибку

  • node не найден — установите Node.js или проверьте PATH;
  • оболочка не понимает подчёркивания в числе — они находятся внутри JavaScript и не должны обрабатываться shell;
  • времена сильно меняются — повторите команды несколько раз и закройте тяжёлые приложения;
  • один запуск оказался быстрее случайно — сравнивайте серию запусков, а не один.

Ограничения и trade-offs

Что влияет на скорость программы?

ФакторПростой вопрос
Объём работыМожно ли выполнить меньше команд?
АлгоритмНе растёт ли работа слишком быстро вместе с данными?
Частота и устройство CPUСколько работы ядро выполняет за время?
Количество ядерМожно ли безопасно разделить работу?
Память и кешУспевают ли приходить данные?
Ожидание I/OНе ждёт ли программа сеть, диск или БД?

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

Failure modes и типичные ошибки

  • CPU — это весь компьютер. Он выполняет команды, но нуждается в памяти, ОС и устройствах.
  • Больше гигагерц всегда означает быстрее. Важны устройство CPU и программа.
  • Больше ядер ускоряет любой код. Последовательную работу нельзя автоматически раздать ядрам.
  • 100% CPU всегда является ошибкой. Для вычислительной задачи это может быть ожидаемо.
  • Низкая загрузка CPU означает быстрый сервис. Сервис может долго ждать БД.
  • Один замер доказывает ускорение. На результат влияют другие процессы и режим работы CPU.

Практическое задание

Задача: запустите обе команды из примера по пять раз и запишите real и user.

Критерии готовности:

  • сохранены результаты всех запусков;
  • посчитано среднее или медианное время;
  • подтверждено, что обе команды выводят результат;
  • сформулировано, почему второй вариант медленнее;
  • объяснена разница между real и user.
Подсказка

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

Проверка знаний

ИНТЕРАКТИВНАЯ ПРОВЕРКА

Основы CPU

0 / 4
01Какова основная роль CPU?
02Процессор с частотой 4 ГГц всегда вдвое быстрее процессора с частотой 2 ГГц.
03Что помогает CPU выполнять программу?
04В каком порядке исследовать медленный вычислительный участок?
  1. Изменить горячий участок
  2. Измерить время до изменения
  3. Найти, где CPU тратит время
  4. Повторить измерение и проверить результат
Проверено: 0 из 4

Самопроверка

  1. Чем процессор отличается от ядра?
  2. Зачем CPU нужны регистры и кеш?
  3. Почему 4 ГГц не гарантируют двукратное ускорение относительно 2 ГГц?
  4. Как понять, что программа скорее ждёт сеть, чем использует CPU?
Ответы и критерии
  1. Процессор — весь компонент; внутри него может быть несколько ядер.
  2. Регистры держат ближайшие значения, кеш сокращает ожидание данных из RAM.
  3. За один такт разные CPU и программы выполняют разный объём полезной работы; также влияют память и число ядер.
  4. Время ответа большое, но CPU time и загрузка невелики; нужно измерить время внешней операции.

Краткое резюме

  • CPU выполняет машинные команды.
  • Ядро — самостоятельный исполнитель внутри процессора.
  • Регистры хранят ближайшие значения, кеш приближает часто нужные данные.
  • Частота — только один из факторов скорости.
  • Медленная программа может считать на CPU или ждать ввод-вывод.
  • Оптимизацию начинают с измерения, а заканчивают повторной проверкой.

Следующие шаги

Дальше можно отдельно изучить Registers, CPU Cache и RAM по полному треку. Эти темы подробно раскроют хранилища, которые в этой статье показаны только на общей схеме.

Источники