Предсказание переходов и спекулятивное выполнение
Узнайте, как современные CPU предсказывают переходы и выполняют инструкции спекулятивно, скрывая задержки, почему ошибки предсказания стоят тактов и как побочные эффекты привели к атакам класса Spectre.
«Предсказание переходов и спекулятивное выполнение» — бесплатный урок Assembly Language & x86 Low-Level Systems Programming на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Assembly Language & x86 Low-Level Systems Programming, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Assembly Language & x86 Low-Level Systems Programming содержит 4 уроков всего.
Части этого урока еще не переведены и отображаются на английском.
The Pipeline Problem
Modern CPUs are deeply pipelined, fetching and decoding many instructions ahead. But a conditional branch is a fork: the CPU does not yet know which path to fetch. Stalling would waste the whole pipeline.
Branch Prediction
To avoid stalls the CPU predicts which way a branch will go and keeps fetching. If correct, no time is lost. If wrong, the pipeline is flushed — a costly misprediction penalty of 15-20+ cycles.
How Predictors Learn
The Branch Target Buffer and history tables record past outcomes. A simple 2-bit saturating counter remembers whether a branch was recently taken, predicting that loops keep looping.
Speculative Execution
Beyond predicting, the CPU speculatively executes the predicted path before the condition resolves. If the guess holds, results are committed; if not, they are discarded as if they never ran — architecturally.
Writing Predictable Branches
You help the predictor by making branches consistent. A branch that is almost always taken predicts well; a random branch defeats prediction. Sorting data before a conditional loop can dramatically speed it up.
for (int i = 0; i < n; i++)
if (data[i] >= 128) // predictable only if data is sorted
sum += data[i];A Runnable Benchmark
This C program shows the dramatic effect of sorted vs unsorted data on a branch-heavy loop. Run it and compare timings.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n = 32768;
int *d = malloc(n * sizeof(int));
for (int i = 0; i < n; i++) d[i] = rand() % 256;
long sum = 0;
for (int r = 0; r < 1000; r++)
for (int i = 0; i < n; i++)
if (d[i] >= 128) sum += d[i];
printf("sum=%ld\n", sum);
free(d);
return 0;
}Branchless Programming
You can sometimes eliminate a branch entirely with arithmetic or conditional-move instructions (cmov), so the CPU never needs to predict.
cmp eax, 128
cmovge ebx, ecx ; conditionally move, no branch to mispredictLikely/Unlikely Hints
Compilers expose hints like __builtin_expect (the source of likely()/unlikely() macros) so hot paths fall through and cold paths jump away, improving instruction-cache layout.
if (__builtin_expect(error, 0)) {
handle_error(); // marked cold/unlikely
}The Security Side Effect
Speculative results are discarded architecturally — but they leave traces in the cache. Speculatively loaded data warms cache lines, and that timing difference can be measured. This is the basis of side-channel leaks.
Spectre in a Nutshell
Spectre tricks the predictor into speculatively reading memory it should not, then leaks the value through a cache timing side channel. The reads never commit, so they bypass normal bounds checks during the speculation window.
Mitigations
Defenses include serializing instructions (lfence) to stop speculation past a bounds check, retpolines for indirect branches, and microcode updates. They trade some performance for safety.
cmp index, limit
jae out_of_range
lfence ; block speculation past the checkQuick Check
Test your understanding of speculation.
Recap
You learned how CPUs hide branch latency:
- Branch prediction guesses the path; mispredicts cost a pipeline flush
- Speculative execution runs the predicted path early
- Predictable branches, cmov, and likely/unlikely hints boost speed
- Speculation leaves cache side effects exploited by Spectre;
lfenceand retpolines mitigate it
Изучай Assembly с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 12
- Уроки
- 48
Часто задаваемые вопросы
Урок «Предсказание переходов и спекулятивное выполнение» бесплатный?
Да — полный текст урока «Предсказание переходов и спекулятивное выполнение» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Assembly Language & x86 Low-Level Systems Programming, подпишись на CoddyKit PRO. Курс Assembly Language & x86 Low-Level Systems Programming содержит 4 уроков всего.
Чему я научусь в уроке «Предсказание переходов и спекулятивное выполнение»?
Узнайте, как современные CPU предсказывают переходы и выполняют инструкции спекулятивно, скрывая задержки, почему ошибки предсказания стоят тактов и как побочные эффекты привели к атакам класса Spect… Ты практикуешь Assembly Language & x86 Low-Level Systems Programming с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Assembly Language & x86 Low-Level Systems Programming?
Предыдущий опыт не требуется. Assembly Language & x86 Low-Level Systems Programming на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Предсказание переходов и спекулятивное выполнение»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Assembly Language & x86 Low-Level Systems Programming?
Да. Каждый урок Assembly Language & x86 Low-Level Systems Programming включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Когерентность кэша и производительность
- Ручная оптимизация критических участков
- Переполнение буфера и шелл-код
- Предсказание переходов и спекулятивное выполнение