Visual walkthrough — Processes — PCB, states (new - ready - running - blocked - terminated)
We are trying to answer one question: "One CPU, many jobs — how does the computer keep track of who is doing what, and when?"
Step 1 — One worker, a pile of jobs
WHY start here? Because every complication that follows — states, queues, saving-and-restoring — exists only because the worker has one pair of hands but there are many jobs. If the worker had a hand per job, there would be no states at all. So this single fact is the seed of the entire diagram.
PICTURE. One worker (the CPU) in the middle, three jobs waiting off to the side. Notice: only one job can be in the hands at once.

Step 2 — A job is born: the New state
WHY does "New" deserve its own box? Because setup takes real work (allocating memory, building the bookkeeping record). If we pretended a job was instantly ready, we would ignore the moment where the computer can run out of room and refuse to admit it. "New" is exactly "under construction, not yet allowed into the line."
WHY model the refusal? If there's no room (memory full, too many jobs), the OS may reject the job — it never reaches Ready and is instead sent straight to Terminated (killed before it ever ran). We draw this dashed reject arrow so the diagram truly covers every outcome of New, not just the happy one.
PICTURE. A job appears on the left with a half-finished sticky-note being filled in. It is fenced off from the waiting line — it cannot join yet. A dashed reject arrow shows the no-room path leading straight to Terminated.

Step 3 — Joining the line: Ready, via admit
WHY a separate Ready state, and why a line? Because usually several jobs are all set-up and eager at the same moment, but only one worker exists. Someone must wait. The line is literally the ready queue. Ready = "fully prepared, only missing the CPU."
The transition, in symbols:
- — the job whose sticky-note is done.
- — the OS's decision that there's room; the only way out of New.
- — now standing in the ready queue.
PICTURE. The fence opens; the job walks into the ready line behind others. Its sticky-note now reads state = Ready.

Step 4 — Getting the hands: Running, via dispatch
WHY does dispatch come from Ready and nowhere else? Because the hands can only receive a job that is already fully prepared and standing in line. A job in New (still under construction) or Blocked (waiting on something) is not eligible. So there is exactly one door into Running, and it is labelled dispatch, and it starts in Ready.
- — the pool of eligible jobs.
- — the scheduler's choice; the mechanics of choosing are CPU Scheduling.
- — now, and only now, is real work getting done on the program's instructions.
PICTURE. The scheduler (a small hand-icon) lifts the front job out of the line and places it into the worker's hands. Exactly one job is in the hands.

Step 5 — Losing your turn (but not your ability): Running → Ready, via timeout
WHY back to Ready — why not Blocked? This is the trap most people fall into. The job that got timed-out is perfectly able to keep working — it did nothing wrong, it just ran out of turn. "Able to work but waiting for the hands" is the exact definition of Ready. So it rejoins the line.
WHY is the interrupt the trigger? The job would never choose to stop early. So the hardware interrupt (the clock alarm) is what forcibly wrests the hands back — the timeout transition literally cannot happen without that interrupt firing. That is why the arrow is labelled with both: timeout is the policy, interrupt is the mechanism that enforces it.
- — the job whose slice just expired.
- — the clock interrupt fires; nothing about the job is broken.
- — straight back into the line, still fully runnable.
PICTURE. The alarm clock rings over the worker; the current job is placed back at the tail of the line while the next job is picked up. (This save-and-swap machinery is Context Switching.)

Step 6 — Waiting on the outside world: Running → Blocked → Ready
WHY step out instead of holding the hands and waiting? Because the hands are precious. If a job held the CPU while a disk crawled for 5 ms, thousands of other instructions could have run. So the job releases the CPU and moves to Blocked. This is why Blocked exists: to not waste the worker on slow I/O.
WHY does the event send it to Ready, not straight back to Running? When the data finally arrives, the worker's hands are almost certainly busy with someone else. The job cannot barge in. It must rejoin the line and wait to be dispatched again.
- — the job asked for slow data and stepped aside.
- — sitting in the waiting room; not eligible for the hands.
- — the disk delivered; an interrupt announces it.
- — back to the tail of the line, never straight to the hands.
PICTURE. The job walks from the hands into a fenced "waiting room" labelled I/O. Later an arrow labelled event done carries it — not back to the hands — but to the tail of the ready line.

Step 7 — Why the sticky-note is non-negotiable (the PCB save/restore)
WHY is this the whole reason PCBs exist? Consider skipping it. Job A stopped at instruction 100. We swap to Job B, which runs up to instruction 540. Now A gets the hands again — but the CPU's PC still reads 540, pointing into B's code. A would leap into a stranger's instructions: garbage, crash. The single field PC is what makes "resume exactly where I left off" possible.
- — freeze A's exact position onto its note before letting go.
- — thaw B's saved position back into the CPU.
PICTURE. Two sticky-notes side by side. Arrow out of the CPU into A's note (save); arrow from B's note into the CPU (load). Between them, the hands are momentarily empty — that empty moment is pure overhead.

Step 8 — The end, and the degenerate cases: Terminated
WHY does exit go only from Running? To run its final instruction, a job must be the one holding the hands at that moment — you can only reach your own last line while actually executing. So a natural finish is physically only possible from Running: the exit arrow starts there and nowhere else.
Degenerate / edge cases (the diagram must cover every path, even the strange ones):
- Killed while Running: an outside
kill(or a fatal error) can end a job mid-execution, sending Running → Terminated without reaching a naturalexit. Same destination, different reason. - Killed while Ready or Blocked: a
killsignal can also strike a job that isn't even holding the hands — jumping it from Ready or Blocked straight to Terminated, so it never runs again. A kill can arrive from any live state (Running, Ready, or Blocked). - Rejected at birth (from Step 2): if there was never room, the job goes New → Terminated via reject, never having run.
- A job that only ever computes (never touches I/O): it simply bounces Running ⇄ Ready via timeouts until done. It never visits Blocked. That is legal — Blocked is optional.
- A job stuck forever in Blocked: if its event never arrives (e.g. broken device), it waits indefinitely. It is not Terminated and not wasting the CPU — it just never wakes. The diagram allows this dead-end.
PICTURE. The finished job walks off the far right; its sticky-note is torn up. Dashed "kill" arrows show the shortcut to Terminated from Running, Ready, and Blocked, plus the New reject arrow.

The one-picture summary
Everything above, compressed into the single diagram you should be able to redraw from memory: five boxes, and every legal arrow labelled with the reason it fires — including the dashed kill/reject arrows that can reach Terminated from any live state.

Recall Feynman: tell the whole story in plain words
There is one worker with one pair of hands (the CPU). A job shows up and first has to be set up — sticky-note written, desk space reserved — that's New. If there's no room, the job is turned away right there (rejected) and never runs. Once set up, it stands in the Ready line. When the hands are free, a chooser (the scheduler) picks the front job and hands it over: now it's Running. But it can only hold the hands for a short while — when the alarm (an interrupt) rings it goes back to the line (Ready), because it can still work, it just lost its turn. If instead the job asks for something slow, like a file, it steps into a Blocked waiting room so the worker isn't frozen; when the file finally arrives it rejoins the line (Ready) — never grabs the hands directly, because someone else is probably using them. Every single time a job lets go of the hands, the worker copies down exactly where it stopped (the next-instruction pointer, the Program Counter) onto that job's sticky-note, so it can pick up perfectly later. When a job runs its last instruction it leaves for good — Terminated — and its note is torn up. And at any time a job can be killed — whether it's Running, waiting in line, or in the Blocked room — jumping straight to Terminated. The golden rule that ties it all together: after waiting, you wait again in line — Blocked always goes to Ready, never straight to Running.
Active Recall
Which single state can lead to Terminated by a natural exit?
From which states can a forced kill reach Terminated?
Why does an I/O-completed job go to Ready and not Running?
What move takes a job from New to Ready, and what does it check?
admit — the OS confirms there's room before letting it join the line.