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 по полному треку. Эти темы подробно раскроют хранилища, которые в этой статье показаны только на общей схеме.

Источники ​