Suppose C0 has the only current value and another core wants to read. Must the newest data return to memory first? The answer depends on the protocol. Dirty responsibility names the obligation to preserve or transfer the authoritative version. It does not, by itself, grant the right to change that version. Prerequisite: distinguish E, M, S and O from the permission lesson.
MOESI permits a dirty-responsible O copy alongside read-only S copies, with memory still stale. MSI and MESI have no stable O state: as the previous lesson showed, a remote dirty read must update memory before settling into S / S. See the Primer's discussion of dirty sharing and the Owned state. The following four-message route is one teaching choice coordinated by H, not a universal dirty-transfer ordering.
Assume the same history under MOESI, which also has E: C0 is M / 1, C1 is I / -, H records exclusive(C0), and memory = 0. H forwards the request to C0, accepts C0's value, then gives C1 read permission. C0 gives up write permission at step 2 and keeps dirty responsibility as O. H does not write memory. No local store occurs in this read transaction.
Step | C0 state / value | C1 state / value | H directory | Memory | Newest data |
|---|---|---|---|---|---|
0. Warm start | M / 1 | I / - | exclusive(C0) | 0 | C0: 1 |
1. GetS at H | M / 1 | IS^D / - | exclusive(C0), pend GetS C1 | 0 | C0: 1 |
2. Fwd-GetS at C0 | O / 1 | IS^D / - | exclusive(C0), pend GetS C1 | 0 | C0: 1, Data(1) in flight to H |
3. Data at H | O / 1 | IS^D / - | O: C0, pend GetS C1 | 0 | C0 and H buffer: 1, Data(1) in flight to C1 |
4. Data at C1 | O / 1 | S / 1 | O: C0, pend GetS C1 | 0 | C0 and C1: 1 |
(assumed) grant delivered | O / 1 | S / 1 | O: C0, sharers {C1} | 0 | C0 and C1: 1 |
H's old exclusive record at step 2 is covered by a pending transaction, so it cannot be used to grant a conflicting request. At step 3 the payload sits in H's buffer, not in a third private cache, and H records O: C0 as soon as it arrives, because C0 stays responsible and memory will not be written. Compare the previous lesson: there H kept exclusive(C0) until it had written memory; here memory keeps 0. C1 joins the sharer list only in the '(assumed) grant delivered' row.
At the endpoint H records O: C0, sharers {C1}; C0 can read as well. Both cores may read 1, neither may write, and memory cannot supply a fresh read. C0 must not silently discard the dirty version: to evict, it sends PutM with the data and keeps the line until Put-Ack shows that H has written memory and taken responsibility. S does not mean 'memory current' in every protocol: here C1's S is backed by an O holder. O does not mean C0 is the only cache containing the newest bytes; it identifies the designated responsible holder.
Stable remote-read endpoint | C0 | C1 | Memory | Writer |
|---|---|---|---|---|
MSI or MESI (previous lesson) | S / 1 | S / 1 | 1, updated before settling | None |
MOESI trace above | O / 1 | S / 1 | 0, stale | None |
The existence of another readable copy does not make C1 responsible for preserving the dirty version. H still identifies C0 as responsible, and memory is stale. C0 must complete an accepted transfer or writeback so the authoritative value remains reachable under the directory's rules.