Before you can read the parent note Cache coherence at scale (directory-based), you need to understand every word and symbol it throws at you. We build each one from nothing — a picture first, then the meaning, then why the topic needs it.
In figure s01, follow the violet boxes on top — those are the cores. Directly under each hangs its own orange cache; notice there are four separate orange boxes, not one shared one. That separateness is the whole point: trace the magenta arrow and you'll see the same address copied into two different orange caches at once. All of them connect down to the single navy bar — the shared main memory.
The parent note writes things like "block B at address A". Let's earn every letter.
Recall
What does one block represent, physically? ::: A fixed-size chunk of memory (e.g. 64 bytes) that caches move and track as a single unit.
How do you get block number B from byte address A? ::: B=⌊A/BlockSize⌋ — divide by the block size and round down; the remainder (offset) is discarded.
In M×(2+N), what is the N counting? ::: One bit for each of the N cores — the sharer bit-vector.
Every copy of a block is in some state. The parent uses three. Think of a block as a shared library book.
In figure s03 the three coloured boxes are the three states side by side; read the small navy caption under each to see what it says about main memory (valid vs. stale).
In figure s04, each square is one core's bit; the magenta squares are 1 (has a copy) and the pale ones are 0. Count the magenta squares — that's the size of the sharers set. The caption reads off which cores those are.
Read it top-down: cores with private caches create duplicate copies (the problem); state (2 bits) + sharers (N bits) describe each copy; the home directory stores those in an entry; messages act on entries; the traffic count (snooping vs directory) justifies the whole design.
Cover the right side and answer aloud. If you can, you're ready for the parent note.
What is a core, and why does each having its own cache create a problem?
A core is an independent instruction-runner; because each has a private cache, one address can live in several caches at once and their copies can disagree.
How do you turn a byte address A into a block number B?
B=⌊A/BlockSize⌋ — divide by the block size and round down; the leftover offset bits are discarded.
Why does the state field cost exactly 2 bits?
Three states (Uncached/Shared/Modified) need at least 2 bits, since 1 bit gives only 2 patterns and 2 bits give 4 (three used, one spare).
What does a directory entry hold when the block is Uncached?
State bits =00 and the sharer bit-vector is all zeros — nobody holds a copy.
In a bit-vector 0101 for 4 cores, who holds copies?
Cores 0 and 2 (rightmost bit = core 0).
What does ⟨State,Owner/Sharers⟩ mean?
A directory entry: a paired bundle of the block's state and either its single owner (Modified) or its set of sharers (Shared).
What is snooping, and how does it differ from a directory?
Snooping is broadcast coherence where all cores listen to a shared bus and every miss is heard by everyone; a directory instead records who has each block and messages only them.
What is the home node (HD) and why is it needed?
The fixed place that stores a given address's directory row — a known desk every core can ask "who has this block?"
Why is broadcast O(N2) but directory O(N)?
Broadcast: each of N cores messages all N−1 others → ~N2, every time. Directory: each request goes to 1 home + a few sharers (avg 1–3) → grows with N.
Why does the directory count Invalidate-Acks before granting a write?
To guarantee every old reader has killed its copy first, so no two caches hold different values for one address.