No älä nyt nolaa itseäsi. Mesi on tuo protokolla, alkuperäinen versio oli jo MOESI mutta O-tilan hyödyllisyys on aina ollut vähän kysymysmerkki, dirtyn linjankin kun voi myös siirtää toiselle ytimelle.
Ei voi järkevästi jos käytössä on vain 4 tilaa, M , E , S ja I koska silloin joko
1) Meillä olisi kaksi eri välimuistia M-tilassa mikä olisi laitonta ja meillä olisi konflikti sen suhteen mitä tehdään takaisinkirjoiuksen kanssa sekä sen suhteen, kumpi siihen saa seuraavaksi kirjoittaa.
2) Se invalidoitaisiin siitä alkuperäisestä sen kirjoittaneesta välimuistista. Jos toinen vain lukee sitä, tämä olisi hirveää haaskausta, kun hyvää paikkaansapitävää dataa invalidoitaisiin, tulisi "turha" huti kun sitä dataa seuraavan kerran accessoitaisiin siitä alkuperäisestä välimuistist.
Forward Intelillä on vain vähentämässä koherenssiliikennettä eli vain yksi jaetun datan omistaja jakaa sitä eteenpäin.
Ei vaan mahdollistamassa sen, että sitä jaettua dataa ylipäätään voidaan lukea muille välimuisteille toisista välimuisteista eikä itse muistista. Saman datan voi lähettää vain yksi lähde kerrallaan. Ilman F-tilaa tulisi konflikti siitä, mistä toisesta välimuistista se lähetetään sitä kaipaavalle, kun pitäisi laajentaa myös S-tila vastaamaan snooppeihin, ja sitten tulisi monesta ERI paikasta "täältä löytyy"-signaali.
Mutta aivan samasta protokollasta siis kyse ja kyseisen protokollan tapa hoitaa muistikoherenssius on siis se että ennen cachelinjaan kirjoittamista protokolla invalidoi samat linjat muista cacheista. Enkä muunlaisia välimuistiprotokollia oikeastaan tiedä nykyään missään käytettävän.
Ja O-tila on siis sama kuin shared, siihen ei voi kirjoittaa. Shared-linjat voi poistaa cachesta ilman takaisinkirjoitusta joten jos dirtyn linjan jakaa yhden shared-tilan pitää olla sellaisessa muodossa että sitä ei voida poistaa cachesta ilman kirjoitusta muistiin, siksi se on tuo O.
Ne on
eri protokollat joissa O-tilan olemassaolo tai olemattomuus muuttaa oleellisesti toiminnallisuutta silloin kun yksi lukee ja toinen kirjoittaa.
O-tila mahdollistaa optimoinnin, jossa O-tilassa olevaan kirjoitetaan heti eikä tarvi odotella mitään kuittausta siitä, että invalidoinnit on menneet perille, koska muut eivät kuitenkaan voi yrittää kirjoittaa niissä S-tilassa olevaan välimuistilinjaan ilman kuittausta muilta välimuisteilta. Mikäli joku yrittää ottaa välimuistilinjaa samaan aikaan omakseen, muut failaavat, O-tilassa oleva onnistuu.
ja invalidointisignaali (tai datan broadcastaus, jos toteutus on sellainen, että samalla lähettää uuden datan) voi saapua sitten joitain (tai jopa joitain kymmeniä) kellojaksoja myöhemmin.
Samaa optimointia ei voi tehdä MESI:lle, koska kaikki S-tilassa datan jakavat on siinä tasa-arvoisia, siinä pitää oikeasti varmistua, että se välimuistilinja saadaan omaksi.
MOESI on sarjallisesti konsistentti. Se tarkoittaa sitä, että kaikkein järjestelmässä tapahtuvien muistioperaatioden järjestys näyttää (kaikilla ytimille pyoirivlle softille) softalle samalta, kuin järjestelmässä, jossa mitäään välimuisteja ei olisi, mutta se ei tarkoita sitä, että joka ikinen kellojakso missään ei olisi kahta eri kopioita samasta datasta.
Tilanteessa, jossa siellä on samasta datasta kaksi eri versiota, toinen niistä on invalidoitumassa ja katoamassa välimuistista mutta se invalidointi voi tulla joitain kellojaksoja myöhässä. Se on tällöin matkalla kohti tilaa, jossa missään ei ole kahta kopioita samsata datasta, mutta ei ole vielä saavuttanut sitä tilaa.
Nykyisten prosessorien ja järjestelmien väylärakenne on monimutkainen, ja data vaan ei kulke joka paikkaan yhdessä kellojaksossa. Eikä viidessä. Eikä edes kymmenessä. Se, ettei aina tarvi odotella kuittausta voi tehdä monista kirjoituksista selvästi nopeampaa.
Ja siis koko koherenssi tarkoittaa että koko muistissa, välimuistit mukaanlukien ei ole tilannetta että samassa osoitteessa voisi olla kaksi erilaista arvoa.
Ei tarkoita.
Vaan se tarkoittaa sitä, että kaikille muistia käyttäville tahoille (käytännössä ytimille) näkymä muistiin on konsistentti välimuistista huolimatta. Tämä konsistenttiusvaatimus käytännössä tarkoittaa sitä, että tilannetta jossa samasta datasta on välimuisteissa monta eri versiota pyritään
välttämään ja tämä tilanne ei koskaan ole
pitkään voimassa. Mutta se voi olla
hetkellisesti voimassa. Tällöin kuitenkin systeemillä on aina tarkka tieto siitä,
mikä näistä kopioista on viimeisin joka pitää säilyttää ja se "vanhentunut versio" datasta katoaa
sitten kun joku jo matkalla oleva välimuistin koherenttiusdatapaketti saavuttaa sen välimuistin missä se on.
Sen vanhan datan
voi kuitenkin sieltä toisesta välimusitista lukea tällä välin siihen välimuistiin suoraan kytketty ydin. Tilanne, jossa se niin tekee tarkoittaa aina jompaa kumpaa seuraavista asioista, joko
1) se lukeva ydin käytännössä lukee jotain syknronointimuuttujaa, että "onko toinen vapauttanut lukon tai merkannut signaalin että se on valmis". Tällöin se saa tiedon, että ei ole, odottelee vähän kauemmin, yrittää kohta uudestaan ja saa silloin vähän myöhemmin päivitetyn arvon ja pääsee jatkamaan tai
2) Softan synkronoinnit on rikki. Tätä tilannetta ei kuitenkaan "kellojaksontarkka" tiukempi välimuistikoherenssikaan pelastaisi, softa bugaisi vaikka mitään välimuisteja ei olisi.
Tilanne, jossa softa yrittää "laillisesti lukea" toisen muuttaman dataa seuraavalla kellojaksolla ja saa vanhan "laittoman" arvon ei ole mahdollinen, koska se ei voi tietää, että sitä muuttaa saa lukea ennen kuin se on synkronoinnilla saanu tämän tiedon. Ja muistin konsistenttiussäännöt määrittelee, että se ensin tehty kirjoitus näkyy tälle toiselle ytimelle ennen kuin se synkronointi näkyy tälle, se "vanha data" data
on invalidoitu
siihen mennessä kun sen toinen ydin pystyy saamaan synkrponoinnilta tiedon, että "saa jatkaa" (se koherenssius on toteutettu siten, että konsistenttiusehto toteutuu)
Koska em. tilanne vaatisi aika merkittävästi monimutkaisempaa logiikkaa selvittää mikä data on säilytettävä.
Ei se vaadi mitään monimutkaista logiikka, se on päivänselvää niistä tiloista. S-tilassa olevaa dataa ei koskaan saa välittää muille välimuisteille eikä sitä koskaan kirjoiteta takaisin päämuistiin. Ja S-tilassa oleva välimuistilinja ei voi muuttua M tai O-tilaan jos joku muu välimuistii on jo jommassa kummassa näistä tiloista kommikoimatta tämän toisen välimuistin kanssa ensin. Tässä vaiheessa
viimeistään huomataan, että muualla on jo samasta datasta uudempi versio.
AMD näköjään käyttää kumpaakin tapaa, eli käytetty protokolla on nykyään MDOEFSI, eli koherenssiprotokolla koittaa päätellä onko data jaetussa lukukäytössä vai vuorotellen kahden eri ytimen manipuloitavana, eli siis jaetaanko likainen linja Dirtynä ilman jäävää kopiota alkuperäiselle omistajalle vai jaettuna jolloin alkuperäiselle omistajalle jää kopio (O) ja uusi omistaja joutuu lähetttämään invalidointipyynnön ennen kuin voi kirjoittaa siihen.
Onko sinulla jossain linkkiä tähän protokollaan vai mutuiletko vaan miten LUULET sen toimivan?