What "100% CPU" Really Means
The fan spins up to jet-engine volume, the cursor jerks, and something reports 100% CPU. The instinct is to read that as "the computer is full, there's no room" - like a glass overflowing. That picture is wrong, and it's why the situation feels hopeless.
Here's the true picture: 100% CPU doesn't mean broken, it means fully booked. The CPU is doing the maximum work it can per second, and right now demand is higher than supply. The useful question is never "why is it 100%" - it's "who is taking it all?" And that has an answer you can read off a list in about ten seconds.
⏭️ This phase uses process, PID, and running vs. sleeping from Phase 1. If those are fuzzy, skim Phase 1's recap first.
Find the culprit (do this first)
You're probably here mid-slowdown, so the cheat-card comes first; the why is underneath.
| You're on | Open it | Then |
|---|---|---|
| Windows | Task Manager (Ctrl + Shift + Esc) | Click the CPU column header to sort; the top row is your culprit |
| macOS | Activity Monitor → CPU tab | Click the % CPU column to sort descending |
| Linux / any terminal | type top |
It already sorts by CPU; the top row is the culprit. Press q to quit |
The process at the top of that sorted list, sitting at a high %CPU, is what's burning your machine. Now here's why that number means what it means.
A CPU is several cores: several lanes, not one
What it actually is. Your CPU isn't a single worker - it's several independent workers called cores, each able to run one process at a time. A "4-core" chip can genuinely do four things at once; an 8-core, eight. Think of cores as checkout lanes at a store: more lanes, more customers served simultaneously.
📝 Terminology. A core is one independent processing unit inside the CPU. "How many cores" = how many processes can truly run at the same instant. (Some chips advertise more "threads" than cores via hyper-threading - treat each thread as roughly a lane for our purposes.)
Why this matters for that percentage. This is the trap in "100% CPU." On some tools the number is
averaged across all cores, so 100% means every lane is full. But other tools - including the classic
top - count each core as 100%, so a single process hammering one core out of four shows up as 100%
there, even though three lanes are idle. Knowing whether you're looking at per-core or overall is the
difference between "one process gone wild" and "the whole machine is slammed."
The scheduler: how dozens of processes share a few lanes
What it actually is. You have hundreds of processes and maybe 4-8 cores. The part of the kernel that decides who runs on which core, and for how long is the scheduler. It runs a process for a few milliseconds, pauses it, runs the next, and cycles through everyone fast enough that it looks simultaneous - the trick from the OS guide, now with a name.
One core, a few milliseconds: the scheduler rotates turns. Light load and everyone gets a turn instantly (feels fast); too many hungry processes and your turn comes around late (feels sluggish).
Why this saves you later. "Slow" usually isn't a broken CPU - it's the scheduler with more demand than it can satisfy, so each process's turn arrives later. That's why closing a couple of greedy programs makes everything else snap back: you freed up turns for the rest. The CPU was never sick; it was overbooked.
Load average: the line at the door
What it actually is. On macOS and Linux, top shows three load average numbers - roughly, the
average number of processes that wanted a CPU core over the last 1, 5, and 15 minutes: those running plus
those queued and waiting. It's the length of the line at the checkout, including people already being served.
How to read it (the key rule): compare load to your core count.
load average: 0.42, 0.55, 0.59 ← example readout
On a 4-core machine:
load ~4 → lanes roughly full; healthy and busy
load < 4 → cores to spare (0.42 here = very relaxed)
load > 4 → more demand than cores; processes queueing, things lag
load 8 on 4 cores → twice the work the cores can serve → sluggish
What just happened: these three numbers (an example, not a measurement of your machine) read newest-first:
0.42 over the last minute, 0.55 over five, 0.59 over fifteen - all well under a 4-core budget, and
roughly flat, a calm machine with no buildup. If the one-minute figure were much higher than the
fifteen-minute one, that's a spike just starting; much lower means a storm that's passing.
⚠️ Gotcha. Load average counts processes waiting on disk and other resources, not only the CPU. A machine can show high load while the CPU itself looks idle - usually a disk or I/O bottleneck, not a CPU one. High load + low CPU% = look at the disk, not the cores.
Why one runaway process can pin a whole core
What it actually is. A runaway process is one stuck doing useless work without pausing - most often an infinite loop, or a retry that never gives up. Remember from Phase 1: only a running process burns CPU. A normal program does a little work, then sleeps (waiting for input, network, a timer). A runaway never sleeps - it stays running, so the scheduler keeps handing it turns, and it devours one core completely.
Healthy process: work · sleep · work · sleep · work · sleep (shares nicely)
Runaway process: work · work · work · work · work · work … (never lets go)
└─ pins one core at 100%, fan screams ─┘
A real example. Here's top with a culprit, sorted by CPU (the default):
$ top
top - 16:48:22 up 5 days, 6:31, 2 users, load average: 1.74, 0.98, 0.71
Tasks: 318 total, 2 running, 316 sleeping
%Cpu(s): 26.1 us, 1.4 sy, 72.0 id
MiB Mem : 15872.0 total, 4810.2 free, 7002.1 used, 4059.7 buff/cache
PID USER %CPU %MEM TIME+ COMMAND
7731 ada 99.4 0.6 2:14.83 python3
4821 ada 6.2 7.1 4:03.11 firefox
1190 ada 1.1 2.1 1:22.04 gnome-shell
9032 ada 0.4 0.3 0:00.09 top
What just happened: (an illustrative readout) Tasks: ... 2 running - out of 318 processes, only two
are actually running; the other 316 are sleeping, costing nothing. The top row is the whole problem: PID
7731, a python3 script, at 99.4% CPU - on this per-core tool, one core completely pinned. Its
TIME+ of 2:14 and the rising load average (1.74 over the last minute vs 0.71 over fifteen) both say
this started recently and is climbing. Everything else - even Firefox - is barely using the CPU. The
machine isn't sick; one script is.
From here you have the two facts you need: the name (python3 - what is it? a script you ran? a stuck
tool?) and the PID (7731 - the handle to stop it). Recall its parent with ps if you want to know
what launched it before you kill it.
⚠️ Gotcha. Before you kill -9 a CPU hog, check it's truly runaway and not just busy. A video
export, a code compile, or a backup should use lots of CPU - that's the work you asked for, and it'll
finish. A runaway is work that has no end: same task, climbing TIME+, no progress, often a process you
didn't knowingly start.
🪖 War story. The classic 2am page - "server slow, users complaining" - is often top sorted by CPU
showing one row at 99%: a deploy script that hit an error and retried in a tight loop with no delay,
spinning one core forever. The fix wasn't restarting the server or "adding more CPU." It was kill 7731
(politely) and a one-line sleep added to the retry.
Recap
- 100% CPU = fully booked, not broken. The right question is who's taking it, and that's a sortable list.
- Cores are lanes. Several processes run truly at once; the per-tool meaning of "100%" depends on whether it counts per-core or overall.
- The scheduler hands out rapid turns; "slow" is usually more demand than turns, which is why closing greedy apps revives the rest.
- Load average = the line at the door; compare it to your core count. High load with idle CPU means a disk/I-O bottleneck.
- A runaway process never sleeps, so it pins a core. Find it by sorting on CPU; grab it by name + PID; confirm it's runaway (endless, pointless) not just busy (purposeful, finite) before you kill it.
CPU is one of the two things a stuck machine runs out of. The other feels different - not a screaming fan but a grinding, molasses slowness, ending in "out of memory." That's a different mechanism with a different fix, and it's next.
Watch it animated: CPU scheduling
← Phase 1: Processes, Up Close · Guide overview · Phase 3: What "Out of Memory" Really Means →
Before the quiz: without looking back, say (or jot down) the core idea of this phase in your own words.
Check your understanding 3 questions
1. What does 100% CPU actually mean?
2. How should you read a load average number?
3. What distinguishes a runaway process from one that is merely busy?