A copy containing bytes is only a candidate. Its value must be the newest one, and the requester must also receive the permission it needs. Revisit Who Has the Newest Data? for the difference between H's knowledge and an exclusive cache's silent stores.
The rows below are independent settled snapshots, not a sequence. X started at 0; rows with 1 assume C0 has stored 1. No message is in flight.
Case | C0 state / value | C1 state / value | H directory | Memory | Newest data |
|---|---|---|---|---|---|
MSI, uncached | I / - | I / - | U | 0 | memory: 0 |
MSI, shared | S / 0 | S / 0 | S{C0,C1} | 0 | C0, C1 and memory: 0 |
MESI, E holder | E / 0 | I / - | exclusive(C0) | 0 | C0 and memory: 0 |
MESI, M holder | M / 1 | I / - | exclusive(C0) | 0 | C0: 1 |
MOESI, dirty shared | O / 1 | S / 1 | O: C0, sharers {C1} | 0 | C0 and C1: 1 |
Case | Who answers a new GetS from another cache |
|---|---|
MSI, uncached | Memory: no cache holds X |
MSI, shared | Memory: S copies are clean in settled MSI |
MESI, E holder | C0, through Fwd-GetS, even though memory happens to be current |
MESI, M holder | C0, through Fwd-GetS: memory's 0 is stale |
MOESI, dirty shared | C0, the O holder: memory's 0 is stale |
The E and M rows have identical directory records. H cannot tell them apart, because the E-to-M store is silent. So H must forward to the exclusive holder before granting a conflicting request, even when the line happens to be clean.
In the O row, C1 also holds the newest bytes, but in this course H always asks the designated O holder, which is responsible for the dirty data. A read-only copy at C1 gives C1 no right to supply data for another cache's grant.
A pending transaction can hold the newest value in H's buffer or in a Data in flight. That line is not U merely because both caches show I. The directory record, the data storage and the pending work together decide the source; no one of them alone is enough.
No. The reason is SWMR. If H answers C1 from memory and leaves C0 in E, C0 can still go E to M silently and write while C1 reads. So H must send Fwd-GetS and C0 must downgrade to S, even when the value is current. And H cannot tell E / 0 from M / 1 anyway.