MESI状态转换

222 阅读2分钟

Modified

    1. 当cpu0从内存中读取到最新数据a=0之后,想要进行修改a时数据a的状态M

    2. 现有状态

      1. E->M

        1. 准备写的时候,从内存中拿到最新的值变成E状态,并且将其余CPU中的状态变成I
        2. 进行写操作时,变成M状态
      2. M->S

        1. 当其余CPU进行读时,将数据刷到内存中,并将自己变成S状态
        2. 其余读的CPU状态也变成S
      3. M->I

        1. 当其余CPU进行写时,总线会先去其他CPU找到M状态的缓存,将缓存写到内存,再将要写的CPU变成E状态,其余的变成I状态

Excluded

    1. 当CPU想要写的时候,会去总线拿取当前最新值,然后将自己变成E状态,然后总线会将其余CPU变成I状态

    2. 现有状态

      1. E->S

        1. 当前CPU状态为E时,其余CPU中的状态为I,当其余CPU去读数据时,总线会先去其余CPU捞,如果有E则将E状态的CPU变成S状态,并更新内存数据
      2. E->M

        1. 当前CPU状态为E时,且当前CPU继续对变量进行修改,则会将当前状态变成M

Share

    1. 当前CPU拿到的数据是最新值时的状态

    2. 现有状态

      1. S->S

        1. 当前CPU状态是S时,当前CPU进行读操作时,会直接从当前CPU缓存读
      2. S->I

        1. 当其他CPU对数据进行修改后,会将当前状态为S的CPU状态变成I
      3. S->E

        1. 当前CPU想要对数据进行修改时,会将当前CPU变成E,并刷新内存数据,其余CPU状态会变成I

Invalid

    1. 当前CPU的数据不是最新时的状态

    2. 现有状态

      1. I->S

        1. 当前CPU为I状态,再进行读取最新数据后,会变成S状态
      2. I->E

        1. 当前CPU为I状态,再进行写操作时,会先获取最新的数据之后,此时会变成S状态,当S状态到E状态是,在当前修改操作完成后,总线将其余CPU状态变成I状态,当前CPU变成E状态

注意:状态的转换是总线进行的操作。