Recent from talks
Nothing was collected or created yet.
MESI protocol
View on WikipediaThis article needs additional citations for verification. (May 2023) |
The MESI protocol is an invalidate-based cache coherence protocol, and is one of the most common protocols that support write-back caches. It is also known as the Illinois protocol due to its development at the University of Illinois at Urbana-Champaign.[1] Write back caches can save considerable bandwidth generally wasted on a write through cache. There is always a dirty state present in write-back caches that indicates that the data in the cache is different from that in the main memory. The Illinois Protocol requires a cache-to-cache transfer on a miss if the block resides in another cache. This protocol reduces the number of main memory transactions with respect to the MSI protocol. This marks a significant improvement in performance.[2]
States
[edit]The letters in the acronym MESI represent four exclusive states that a cache line can be marked with (encoded using two additional bits):
- Modified (M)
- The cache line is present only in the current cache, and is dirty - it has been modified (M state) from the value in main memory. The cache is required to write the data back to the main memory at some time in the future, before permitting any other read of the (no longer valid) main memory state. The write-back changes the line to the Shared state (S).
- Exclusive (E)
- The cache line is present only in the current cache, but is clean - it matches main memory. It may be changed to the Shared state at any time, in response to a read request. Alternatively, it may be changed to the Modified state when writing to it.
- Shared (S)
- Indicates that this cache line may be stored in other caches of the machine and is clean - it matches the main memory. The line may be discarded (changed to the Invalid state) at any time.
- Invalid (I)
- Indicates that this cache line is invalid (unused).
For any given pair of caches, the permitted states of a given cache line are as follows:
| M | E | S | I | |
|---|---|---|---|---|
| M | ||||
| E | ||||
| S | ||||
| I |
When the block is marked M (modified) or E (exclusive), the copies of the block in other Caches are marked as I (Invalid).
Operation
[edit]The MESI protocol is defined by a finite-state machine that transitions from one state to another based on 2 stimuli.
The first stimulus is the processor-specific Read and Write request. For example: A processor P1 has a Block X in its Cache, and there is a request from the processor to read or write from that block.
The second stimulus is given through the bus connecting the processors. In particular, the "Bus side requests" come from other processors that don't have the cache block or the updated data in their Cache. The bus requests are monitored with the help of Snoopers,[4] which monitor all the bus transactions.
Following are the different types of Processor requests and Bus side requests:
Processor Requests to Cache include the following operations:
- PrRd: The processor requests to read a Cache block.
- PrWr: The processor requests to write a Cache block
Bus side requests are the following:
- BusRd: Snooped request that indicates there is a read request to a Cache block requested by another processor
- BusRdX: Snooped request that indicates there is a write request to a Cache block requested by another processor that doesn't already have the block.
- BusUpgr: Snooped request that indicates that there is a write request to a Cache block requested by another processor that already has that cache block residing in its own cache.
- Flush: Snooped request that indicates that an entire cache block is written back to the main memory by another processor.
- FlushOpt: Snooped request that indicates that an entire cache block is posted on the bus in order to supply it to another processor (Cache to Cache transfers).
(Such Cache to Cache transfers can reduce the read miss latency if the latency to bring the block from the main memory is more than from Cache to Cache transfers, which is generally the case in bus based systems.)
Snooping Operation: In a snooping system, all caches on a bus monitor all the transactions on that bus. Every cache has a copy of the sharing status of every block of physical memory it has stored. The state of the block is changed according to the State Diagram of the protocol used. (Refer image above for MESI state diagram). The bus has snoopers on both sides:
- Snooper towards the Processor/Cache side.
- The snooping function on the memory side is done by the Memory controller.
Explanation:
Each Cache block has its own 4 state finite-state machine (refer image 1.1). The State transitions and the responses at a particular state with respect to different inputs are shown in Table1.1 and Table 1.2
| Initial State | Operation | Response |
|---|---|---|
| Invalid(I) | PrRd |
|
| PrWr |
| |
| Exclusive(E) | PrRd |
|
| PrWr |
| |
| Shared(S) | PrRd |
|
| PrWr |
| |
| Modified(M) | PrRd |
|
| PrWr |
|
| Initial State | Operation | Response |
|---|---|---|
| Invalid(I) | BusRd |
|
| BusRdX/BusUpgr |
| |
| Exclusive(E) | BusRd |
|
| BusRdX |
| |
| Shared(S) | BusRd |
|
| BusRdX/BusUpgr |
| |
| Modified(M) | BusRd |
|
| BusRdX |
|
A write may only be performed freely if the cache line is in the Modified or Exclusive state. If it is in the Shared state, all other cached copies must be invalidated first. This is typically done by a broadcast operation known as Request For Ownership (RFO).
A cache that holds a line in the Modified state must snoop (intercept) all attempted reads (from all the other caches in the system) of the corresponding main memory location and insert the data that it holds. This can be done by forcing the read to back off (i.e. retry later), then writing the data to main memory and changing the cache line to the Shared state. It can also be done by sending data from Modified cache to the cache performing the read. Note, snooping only required for read misses (protocol ensures that Modified cannot exist if any other cache can perform a read hit).
A cache that holds a line in the Shared state must listen for invalidate or request-for-ownership broadcasts from other caches, and discard the line (by moving it into Invalid state) on a match.
The Modified and Exclusive states are always precise: i.e. they match the true cache line ownership situation in the system. The Shared state may be imprecise: if another cache discards a Shared line, this cache may become the sole owner of that cache line, but it will not be promoted to Exclusive state. Other caches do not broadcast notices when they discard cache lines, and this cache could not use such notifications without maintaining a count of the number of shared copies.
In that sense the Exclusive state is an opportunistic optimization: If the CPU wants to modify a cache line in state S, a bus transaction is necessary to invalidate all other cached copies. State E enables modifying a cache line with no bus transaction.
Illustration of MESI protocol operations
For example, let us assume that the following stream of read/write references. All the references are to the same location and the digit refers to the processor issuing the reference.
The stream is : R1, W1, R3, W3, R1, R3, R2.
Initially it is assumed that all the caches are empty.
| Local Request | P1 | P2 | P3 | Generated
Bus Request |
Data Supplier | |
|---|---|---|---|---|---|---|
| 0 | Initially | - | - | - | - | - |
| 1 | R1 | E | - | - | BusRd | Mem |
| 2 | W1 | M | - | - | - | - |
| 3 | R3 | S | - | S | BusRd | P1's Cache |
| 4 | W3 | I | - | M | BusUpgr | - |
| 5 | R1 | S | - | S | BusRd | P3's Cache |
| 6 | R3 | S | - | S | - | - |
| 7 | R2 | S | S | S | BusRd | P1/P3's Cache |
Note: The term snooping referred to below is a protocol for maintaining cache coherency in symmetric multiprocessing environments. All the caches on the bus monitor (snoop) the bus if they have a copy of the block of data that is requested on the bus.
- Step 1: As the cache is initially empty, so the main memory provides P1 with the block and it becomes exclusive state.
- Step 2: As the block is already present in the cache and in an exclusive state so it directly modifies that without any bus instruction. The block is now in a modified state.
- Step 3: In this step, a BusRd is posted on the bus and the snooper on P1 senses this. It then flushes the data and changes its state to shared. The block on P3 also changes its state to shared as it has received data from another cache. The data is also written back to the main memory.
- Step 4: Here a BusUpgr is posted on the bus and the snooper on P1 senses this and invalidates the block as it is going to be modified by another cache. P3 then changes its block state to modified.
- Step 5: As the current state is invalid, thus it will post a BusRd on the bus. The snooper at P3 will sense this and so will flush the data out. The state of both the blocks on P1 and P3 will become shared now. Notice that this is when even the main memory will be updated with the previously modified data.
- Step 6: There is a hit in the cache and it is in the shared state so no bus request is made here.
- Step 7: There is cache miss on P2 and a BusRd is posted. The snooper on P1 and P3 sense this and both will attempt a flush. Whichever gets access of the bus first will do that operation.
Read For Ownership
[edit]A Read For Ownership (RFO) is an operation in cache coherency protocols that combines a read and an invalidate broadcast. The operation is issued by a processor trying to write into a cache line that is in the shared (S) or invalid (I) states of the MESI protocol. The operation causes all other caches to set the state of such a line to I. A read for ownership transaction is a read operation with intent to write to that memory address. Therefore, this operation is exclusive. It brings data to the cache and invalidates all other processor caches that hold this memory line. This is termed "BusRdX" in tables above.
Memory Barriers
[edit]MESI in its naive, straightforward implementation exhibits two particular performance issues. First, when writing to an invalid cache line, there is a long delay while the line is fetched from other CPUs. Second, moving cache lines to the invalid state is time-consuming. To mitigate these delays, CPUs implement store buffers and invalidate queues.[5]
Store Buffer
[edit]A store buffer is used when writing to an invalid cache line. As the write will proceed anyway, the CPU issues a read-invalid message (hence the cache line in question and all other CPUs' cache lines that store that memory address are invalidated) and then pushes the write into the store buffer, to be executed when the cache line finally arrives in the cache.
A direct consequence of the store buffer's existence is that when a CPU commits a write, that write is not immediately written in the cache. Therefore, whenever a CPU needs to read a cache line, it first scans its own store buffer for the existence of the same line, as there is a possibility that the same line was written by the same CPU before but hasn't yet been written in the cache (the preceding write is still waiting in the store buffer). Note that while a CPU can read its own previous writes in its store buffer, other CPUs cannot see those writes until they are flushed to the cache — a CPU cannot scan the store buffer of other CPUs.
Invalidate Queues
[edit]With regard to invalidation messages, CPUs implement invalidate queues, whereby incoming invalidate requests are instantly acknowledged but not immediately acted upon. Instead, invalidation messages simply enter an invalidation queue and their processing occurs as soon as possible (but not necessarily instantly). Consequently, a CPU can be oblivious to the fact that a cache line in its cache is actually invalid, as the invalidation queue contains invalidations that have been received but haven't yet been applied. Note that, unlike the store buffer, the CPU can't scan the invalidation queue, as that CPU and the invalidation queue are physically located on opposite sides of the cache.
As a result, memory barriers are required. A store barrier will flush the store buffer, ensuring all writes have been applied to that CPU's cache. A read barrier will flush the invalidation queue, thus ensuring that all writes by other CPUs become visible to the flushing CPU. Furthermore, memory management units do not scan the store buffer, causing similar problems. This effect is visible even in single threaded processors.[6]
Advantages of MESI over MSI
[edit]The most striking difference between MESI and MSI is the extra "exclusive" state present in the MESI protocol. This extra state was added as it has many advantages. When a processor needs to read a block that none of the other processors have and then write to it, two bus transactions will take place in the case of MSI. First, a BusRd request is issued to read the block followed by a BusUpgr request before writing to the block. The BusRd request in this scenario is useless as none of the other caches have the same block, but there is no way for one cache to know about this. Thus, MESI protocol overcomes this limitation by adding an Exclusive state, which results in saving a bus request. This makes a huge difference when a sequential application is running. As only one processor works on a piece of data, all the accesses will be exclusive. MSI performs much worse in this case due to the extra bus messages. Even in the case of a highly parallel application with minimal sharing of data, MESI is far faster. Adding the Exclusive state also comes at no cost as 3 states and 4 states are both representable with 2 bits.
Disadvantage of MESI
[edit]In case continuous read and write operations are performed by various caches on a particular block, the data has to be flushed to the bus every time. Thus, the main memory will pull this on every flush and remain in a clean state. But this is not a requirement and is just an additional overhead caused by using MESI. This challenge was overcome by the MOESI protocol.[7]
In case of S (Shared State), multiple snoopers may response with FlushOpt with the same data (see the example above). The F state in MESIF addresses this redundancy.
See also
[edit]- Coherence protocol
- MSI protocol, the basic protocol from which the MESI protocol is derived.
- Write-once (cache coherency), an early form of the MESI protocol.
- MOSI protocol
- MOESI protocol
- MESIF protocol
- MERSI protocol
- Dragon protocol
- Firefly protocol
References
[edit]- ^ Papamarcos, M. S.; Patel, J. H. (1984). "A low-overhead coherence solution for multiprocessors with private cache memories" (PDF). Proceedings of the 11th annual international symposium on Computer architecture - ISCA '84. p. 348. doi:10.1145/800015.808204. ISBN 0818605383. S2CID 195848872. Retrieved March 19, 2013.
- ^ Gómez-Luna, J.; Herruzo, E.; Benavides, J.I. "MESI Cache Coherence Simulator for Teaching Purposes". Clei Electronic Journal. 12 (1, PAPER 5, APRIL 2009). CiteSeerX 10.1.1.590.6891.
- ^ Culler, David (1997). Parallel Computer Architecture. Morgan Kaufmann Publishers. pp. Figure 5–15 State transition diagram for the Illinois MESI protocol. Pg 286.
- ^ Bigelow, Narasiman, Suleman. "An evaluation of Snoopy Based Cache Coherence protocols" (PDF). ECE Department, University of Texas at Austin.
{{cite web}}: CS1 maint: multiple names: authors list (link) - ^ Handy, Jim (1998). The Cache Memory Book. Morgan Kaufmann. ISBN 9780123229809.
- ^ Chen, G.; Cohen, E.; Kovalev, M. (2014). "Store Buffer Reduction with MMUs". Verified Software: Theories, Tools and Experiments. Lecture Notes in Computer Science. Vol. 8471. p. 117. doi:10.1007/978-3-319-12154-3_8. ISBN 978-3-319-12153-6.
- ^ "Memory System (Memory Coherency and Protocol)" (PDF). AMD64 Technology. September 2006.
External links
[edit]MESI protocol
View on GrokipediaBackground
Cache Coherence Fundamentals
In shared-memory multiprocessor systems, each processor typically maintains a private cache to reduce latency and bandwidth pressure on the main memory. However, when multiple processors access the same shared data, their caches may hold duplicate copies of the same memory block, leading to inconsistencies if one processor modifies its local copy without propagating the change to others. This cache coherence problem arises because caches operate independently, potentially resulting in stale data in some caches while others reflect updates, which can cause incorrect program execution in parallel applications such as bounded-buffer queues or iterative solvers.[6] To address this, cache coherence protocols enforce consistency across all copies of a shared memory block. A fundamental requirement is the single-writer-multiple-reader (SWMR) invariant, which permits multiple caches to simultaneously hold read-only copies of a block but ensures only one cache can write to it at a time, preventing simultaneous modifications. Additionally, write serialization mandates that all writes to the same memory location appear in the same total order across processors, guaranteeing that subsequent reads observe updates in a predictable sequence. These properties collectively ensure that processors perceive a unified view of memory despite distributed caching.[6] Coherence mechanisms generally fall into two categories: snooping-based protocols, which rely on a shared broadcast medium like a bus where all caches monitor (or "snoop") transactions to update their states, and directory-based protocols, which maintain a centralized or distributed directory tracking the location and status of each memory block's copies, enabling point-to-point communication in non-bus topologies. Within these, protocols differ in their approach to handling writes: invalidate-based methods, such as the MESI protocol, respond to a write by invalidating copies in other caches to force future reads to fetch the updated version, whereas update-based methods broadcast the new value to all relevant caches. The invalidate approach minimizes bandwidth for read-heavy workloads but can increase miss rates during frequent writer handoffs, while updates reduce misses at the cost of higher traffic for unmodified copies.[6]Historical Development
The MESI protocol originated at the University of Illinois at Urbana-Champaign, where it was developed as the Illinois Cache Coherence Protocol to address coherence challenges in shared-bus multiprocessor systems with private caches. It was first formally described in 1984 by Mark S. Papamarcos and Janak H. Patel in their seminal paper, which proposed a low-overhead snooping-based solution that minimized bus traffic compared to prior approaches. This work built upon earlier three-state protocols like MSI by introducing an Exclusive state, allowing caches to track clean shared data without immediate invalidation, thereby optimizing performance in write-back cache environments.[7] Following its academic introduction, the MESI protocol gained widespread industry adoption in the 1990s as commercial multiprocessor systems emerged. Intel integrated a variant of MESI into its processor architectures starting with the Pentium family, including the original Pentium (1993) and subsequent models like the Pentium II and III, to maintain coherence across on-chip and off-chip caches in symmetric multiprocessing configurations. This implementation supported efficient write-back caching and snooping mechanisms, enabling scalable multi-core designs without excessive hardware overhead.[8] The protocol's influence has persisted through evolutions in hardware design, evolving from its MSI roots to form the basis for extended variants that handle increasing core counts and cache hierarchies. By the 2000s, Intel refined MESI into protocols like MESIF for Nehalem microarchitecture processors such as the Core i7, adding a Forward state to further reduce snoop traffic in larger systems. As of 2025, core principles of MESI remain foundational in modern x86 multicore processors, including Intel's latest generations, where they underpin coherence in chiplet-based and high-core-count architectures, ensuring consistent memory views amid growing parallelism.[9][10]Protocol Overview
Definition and Core Principles
The MESI protocol, also referred to as the Illinois protocol, is a cache coherence mechanism employed in shared-memory multiprocessor systems to ensure data consistency across multiple private caches. It defines four possible states for each cache block—Modified (M), Exclusive (E), Shared (S), and Invalid (I)—allowing caches to track whether their copy of a memory block is up-to-date, unique, or requires invalidation.[1] This state-based approach enables efficient management of data replication and modification in systems where multiple processors access shared memory locations.[1] At its core, the MESI protocol is an invalidate-based cache coherence mechanism, commonly implemented via snooping in bus-based or directory-based multiprocessor architectures that utilize write-back caches. In this setup, each cache controller monitors (or "snoops") all transactions on the shared bus to detect when another processor is reading or writing to a memory address, triggering local state updates to enforce coherence.[1] The protocol relies on the single-writer-multiple-reader (SWMR) invariant, where only one cache can modify a block at a time (in the M or E state), while multiple caches can hold read-only copies (in the S state), ensuring that writes are propagated or other copies invalidated to prevent stale data.[1] This design draws from the broader class of compatible consistency protocols, such as those outlined in early work on cache states including owned and modified variants.[4] The fundamental goal of MESI is to provide all processors with a consistent view of memory—guaranteeing that subsequent reads reflect the most recent writes—while optimizing performance by reducing unnecessary bus traffic in common access patterns like read-followed-by-write.[1] For instance, the Exclusive state allows a cache to silently upgrade to Modified for a write without bus intervention if no other caches hold the block, minimizing overhead compared to simpler protocols.[1] In high-level operation, when a processor issues a read or write miss, it broadcasts a coherence request (e.g., for shared or modified permission) on the bus; responding caches snoop this request, supply data if needed, or invalidate their copies, with the requesting cache then transitioning its block state accordingly to maintain global coherence.[1] This workflow enforces a total order on coherence events, supporting memory consistency models such as sequential consistency.[1]Relation to Write-Back Caches
Write-back caches update the main memory only when a modified (dirty) cache line is evicted, in contrast to write-through caches, which propagate every write immediately to memory for consistency.[11] The MESI protocol is specifically designed to support write-back caches by allowing deferred memory updates, enabling processors to modify data locally without immediate bus traffic.[12] In the MESI protocol, the Modified state explicitly tracks dirty data through an associated dirty bit, indicating that the cache line differs from main memory and must be written back upon eviction to maintain coherence.[13] This state ensures that only the owning cache holds the valid, updated copy, deferring the write to memory until necessary, such as during replacement or when another processor requests the line.[12] By permitting writes in the Modified or Exclusive states without bus involvement, MESI reduces memory bandwidth usage compared to protocols requiring immediate updates, as repeated local modifications avoid unnecessary memory accesses.[12] This efficiency is particularly beneficial in invalidate-based schemes like MESI, where bus traffic is minimized for private data accesses.[13] In modern CPU architectures, MESI integrates seamlessly with multi-level cache hierarchies, such as private L1 caches per core and shared L2 caches, by applying snooping at the L1 level to maintain coherence while leveraging write-back policies across levels.[13] For instance, implementations in processors like Intel Core Duo use MESI to ensure L1 data coherence relative to the shared L2, with write-backs occurring only on eviction from the hierarchy.[13]States
State Definitions
The MESI protocol defines four distinct states for each cache line in a multiprocessor system with write-back caches, enabling efficient maintenance of coherence across multiple caches. These states—Modified (M), Exclusive (E), Shared (S), and Invalid (I)—capture the validity, exclusivity, and cleanliness of data relative to main memory, determining whether a processor can access the line locally without invoking bus transactions for coherence.[1][13] Invalid (I): This state indicates that the cache line does not contain valid data, either because it has never been fetched or because it has been invalidated by a coherence action from another cache. In the I state, the line cannot be read or written, requiring the processor to issue a coherence request (such as a read or read-exclusive transaction) to transition to a valid state before access. This ensures no stale or undefined data is used, preventing coherence violations.[1][14][13] Shared (S): A cache line in the S state holds a clean copy of the data that matches the value in main memory and may be present in multiple caches simultaneously. This state permits reads without bus intervention, as the data is consistent across all holders, but prohibits writes; any write attempt requires a coherence transaction to invalidate other copies or upgrade the state, ensuring no divergent modifications occur. The S state optimizes for read-heavy workloads where data is accessed by multiple processors without modification.[1][14][13] Exclusive (E): The E state represents a clean, unique copy of the cache line in a single cache, matching the main memory value with no valid copies elsewhere in the system. It allows both reads and writes without immediate bus intervention: reads proceed locally, and writes can silently upgrade to the Modified state since exclusivity guarantees no other caches need invalidation. This state facilitates efficient local modifications before sharing, reducing coherence traffic compared to starting from Shared.[1][14][13] Modified (M): In the M state, the cache line contains a dirty copy that has been locally modified, differing from main memory, and is the only valid version held exclusively by that cache. Both reads and writes are permitted without bus intervention, as the cache owns the up-to-date data; however, on eviction or coherence requests from other caches, the modified data must be written back to memory to restore consistency. This state supports write-intensive operations while ensuring eventual propagation of changes.[1][14][13]| State | Validity | Exclusivity | Cleanliness | Read Permission (No Bus) | Write Permission (No Bus) |
|---|---|---|---|---|---|
| I | Invalid | N/A | N/A | No | No |
| S | Valid | Shared | Clean | Yes | No |
| E | Valid | Exclusive | Clean | Yes | Yes (silent upgrade) |
| M | Valid | Exclusive | Dirty | Yes | Yes |
State Transitions
The MESI protocol governs state transitions through a finite-state machine that responds to two primary stimuli: local processor requests (such as reads and writes) and snooped bus transactions from other processors (such as read or write requests). These transitions ensure cache coherence by maintaining consistency across caches while minimizing unnecessary communication. Local actions include cache hits and misses, while snooping involves monitoring bus requests like GetS (for shared reads), GetM (for exclusive modifications), and invalidations. Transient states, such as those awaiting data or acknowledgments, may occur during transitions but resolve to stable states (Modified, Exclusive, Shared, or Invalid) upon completion.[1] Transitions from the Invalid (I) state typically occur on a local read or write miss. A read miss (GetS request) transitions I to Exclusive (E) if no other caches hold the block (no sharers detected), allowing the requesting cache to obtain the data exclusively from memory or the last-level cache. If sharers exist, it transitions to Shared (S), reflecting multiple read-only copies. A write miss (GetM request) transitions I to Modified (M), fetching the data, invalidating any existing copies if necessary, and granting ownership for modification. In all cases, the transition completes upon receiving the data response.[1] From the Exclusive (E) state, local actions are efficient due to sole ownership. A local store (write) silently transitions E to M without bus activity, as no coherence actions are needed. However, a snooped GetS from another processor transitions E to S, supplying data to the requester and demoting exclusivity. A snooped GetM or local eviction (Own-PutE) transitions E to I, invalidating the block; for evictions, this may involve a transient state (e.g., EI_A) awaiting an acknowledgment (Put-Ack) from the memory controller before finalizing I. Acknowledgments ensure the protocol's atomicity, preventing races during invalidations or write-backs.[1] The Shared (S) state handles read-only copies and transitions primarily on write requests. A local read hit remains in S with no change. A local store (Own-GetM) transitions S to M via a transient state (e.g., SM_AD), issuing invalidations to other sharers and awaiting Inv-Ack acknowledgments from all affected caches before assuming ownership. A snooped GetM from another processor transitions S to I, as the block is invalidated to allow the new owner. Silent replacement (local eviction without bus traffic) also transitions S to I. Acknowledgments in S-to-M transitions are critical, as the requesting cache must confirm all invalidations before proceeding to avoid stale data propagation.[1] In the Modified (M) state, the cache holds the sole dirty copy. A local read or write hit remains in M. A snooped GetS transitions M to S, flushing dirty data to the bus for the requester and demoting to shared status. A snooped GetM or local eviction (Own-PutM) transitions M to I, writing back dirty data to memory; evictions use a transient state (e.g., MI_A) awaiting Put-Ack. Bus snoops like BusRd (read request) explicitly transition M to S with data supply, while BusRdX (write request) transitions M, E, or S to I with appropriate data forwarding or invalidation. These rules prioritize write-back efficiency, delaying memory updates until necessary.[1] The following table summarizes key stable state transitions, highlighting conditions for local actions and snoops:| Current State | Local Action/Event | Condition | Next State | Notes/Acknowledgment Role |
|---|---|---|---|---|
| I | Read miss (GetS) | No sharers | E | Data from memory; no ack needed |
| I | Read miss (GetS) | Sharers exist | S | Data from memory; no ack needed |
| I | Write miss (GetM) | Any | M | Data and ownership acquired; no ack needed |
| E | Local store | Hit | M | Silent upgrade; no bus or ack |
| E | Snooped GetS | Other processor read | S | Data supplied; no ack |
| E | Snooped GetM or Own-PutE | Write request or eviction | I | Invalidate; Put-Ack for eviction |
| S | Local store (Own-GetM) | Hit (upgrade) | M | Via transient (SM_AD); requires Inv-Ack |
| S | Snooped GetM or silent replace | Other write or eviction | I | Invalidate; no ack for silent |
| M | Snooped GetS (BusRd) | Other processor read | S | Flush data; no ack |
| M | Snooped GetM or Own-PutM | Write request or eviction | I | Write-back data; Put-Ack for eviction |
