În MPVs comun de autobuz (memorie partajată Proccessing - multiprocesor memorie diviziune, SMP-arhitectura) toate modulele functionale (... procesoarele P1, P2 PM memorie MP1, MP2 dispozitiv IPC IO UVV1, UVV2 IODMs) sunt conectate la o comunicație intermodulă comună a magistralei, a cărei lățime poate fi de la un bit la mai mulți octeți. Între modulele sistemului nu există legături permanente, informațiile dintre acestea sunt transmise în modul de partajare a timpului. În orice moment, numai un singur pachet de informații dintr-o singură sursă este transmis prin intermediul magistralei. Alte surse de informații ar trebui să aștepte până la eliberarea autobuzului de sistem. [10]
Principalele avantaje ale unui sistem cu legături intermodulare de autobuz comune:
- sistemul este caracterizat printr-o complexitate funcțională relativ scăzută și un cost redus;
- sistemul reconfigurează cu ușurință structura prin adăugarea sau eliminarea modulelor funcționale.
Dezavantaje ale unor astfel de sisteme:
- limitarea performanțelor sistemului prin capacitatea autobuzului comun;
- degradarea performanței globale a sistemului atunci când este extinsă prin adăugarea de module;
- pierderea performanțelor sistemului legate de rezolvarea conflictelor, care apar atunci când mai multe module susțin în același timp că ocupă un autobuz comun pentru transmiterea de informații. Aceste pierderi pot fi reduse dacă, în plus față de memoria partajată disponibilă tuturor procesoarelor, fiecare dintre acestea este echipată cu memorie locală (procesor locală) pentru stocarea informațiilor care participă la cea mai apropiată serie de calcule. Cu memoria locală, frecvența accesului procesoarelor la memoria partajată scade, astfel că frecvența conflictelor și pierderea timpului pentru rezoluția lor scade;
- Eșecul autobuzului comun duce la defectarea întregului sistem.
Organizarea conexiunilor dintre elementele sistemului pe baza autobuzului comun este una dintre cele mai răspândite moduri de a construi nu numai sisteme multiprocesoare, ci și sisteme multi-computere de putere mică.
SMA arhitectura a devenit un fel de standard pentru toate serverele multiprocesoare moderne (de exemplu, HP9000 și DEC Alpha Server AXP).
La prima dezvoltare a acestui tip de mașini a fost posibilă plasarea întregului procesor și a cache-ului pe o singură placă, care a fost apoi introdusă în panoul din spate, cu care a fost implementată arhitectura magistralei. Proiectele moderne permit plasarea a până la patru procesoare pe o singură placă. În Fig. 2 prezintă o diagramă a unei astfel de mașini.
Într-o astfel de mașină, cache-urile pot conține atât date partajate, cât și date private. Datele private sunt date care sunt utilizate de un procesor, în timp ce datele partajate sunt utilizate de mai mulți procesatori, oferind în principal un schimb între ei. Atunci când un element de date private este stocat în cache, valoarea sa este transferată în memoria cache pentru a reduce timpul de acces mediu, precum și lățimea de bandă necesară. Deoarece niciun alt procesor nu utilizează aceste date, acest proces este identic cu procesul pentru o mașină cu un singur procesor cu memorie cache. Dacă datele partajate sunt stocate în cache, atunci valoarea partajată este reprodusă și poate fi cuprinsă în mai multe cache-uri. Pe lângă reducerea latenței de acces și a lățimii de bandă necesare, această replicare a datelor contribuie, de asemenea, la o reducere generală a numărului de schimburi. Cu toate acestea, stocarea datelor partajate cauzează o nouă problemă: coerența cache-ului. [11]
Problema în cauză rezultă din faptul că valoarea elementului de date din memorie, stocată în două procesoare diferite, este disponibilă acestor procesoare numai prin cache-urile lor individuale. În Fig. 3.30 arată un exemplu simplu care ilustrează această problemă.
Problema de coerență a memoriei pentru multiprocesoare și dispozitive de I / O are multe aspecte. De obicei, microprocesoarele mici folosesc un mecanism hardware, numit un protocol, pentru a rezolva această problemă. Aceste protocoale se numesc protocoale de coerență în cache. Există două clase de astfel de protocoale:
1. Protocoale bazate pe director (bazate pe director). Informațiile despre starea blocului de memorie fizică sunt conținute doar într-un singur loc, numit un director (fizic, directorul poate fi distribuit între nodurile sistemului). Această abordare va fi luată în considerare în Sec. 3.30.
2. Protocoalele de observare (snooping). Fiecare cache care conține o copie a datelor unui anumit bloc de memorie fizică are, de asemenea, o copie corespunzătoare a informațiilor despre serviciu despre starea sa. Nu există un sistem centralizat de înregistrare. De obicei, cache-urile sunt localizate pe un autobuz partajat, iar toți controlorii cache-ului urmăresc autobuzul (vizualizează-l) pentru a determina dacă conțin o copie a blocului corespunzător.
În sistemele multiprocesor, folosind microprocesoare cu memoria cache conectat la memoria partajată centralizată, protocoalele de observare au devenit populare ca să sondeze starea cache-uri, acestea pot utiliza o conexiune preexistent fizică - un autobuz de memorie.
Figura 2 - Ilustrația problemei coerenței a memoriei cache
În mod informal, problema coerenței memoriei constă în necesitatea de a se asigura că orice citire a elementului de date returnează ultima dată valoarea scrisă în el. Această definiție nu este complet corectă, deoarece este imposibil să se solicite ca operația de citire să vadă instantaneu valoarea scrisă acestui element de date de un alt procesor. Dacă, de exemplu, o singură operație procesor de scriere precede operația de citire, din aceeași celulă pe un alt procesor într-un interval de timp foarte scurt, este imposibil să se garanteze faptul că valoarea de date de returnare de citire înregistrate, deoarece în acest moment, datele de înregistrare nu poate lăsa chiar procesorul. Problema exact când valoarea înregistrată trebuie să fie disponibilă pentru procesorul care efectuează citirea, este determinată de modelul selectat status coerent (consistent) memoriei și asociate cu implementarea sincronizării de calcul paralel. Prin urmare, în scopul simplității, să presupunem că avem nevoie doar pentru a înregistra valoarea record de tranzacții au fost disponibile operații de citire care au avut loc puțin mai târziu că înregistrarea și procesarea operațiunii de scriere sunt întotdeauna vizibile în ordinea executării lor. [12]
Cu această definiție simplă a unei stări consistente de memorie, putem garanta coerența prin oferirea a două proprietăți:
Funcționarea citirii unei celule de memorie de către un procesor care urmează operației de scriere în aceeași locație de memorie de către un alt procesor va obține valoarea înregistrată dacă operațiile de citire și scriere sunt suficient de separate una de cealaltă în timp.
scrie operațiuni în aceeași celulă de memorie sunt realizate strict secvențial (uneori, spun că sunt serializate): aceasta înseamnă că două scrieri consecutive la aceeași locație de memorie vor fi respectate de către alte procesoare exact în ordinea în care acestea apar în programul procesorului care efectuează aceste operații de scriere.
Prima proprietate este în mod evident legată de definirea unei stări de memorie coerente (consecvente): dacă procesorul va citi mereu numai valoarea datelor vechi, am spune că memoria este incoerentă.
Necesitatea operațiilor de înregistrare strict secvențială este mai subtilă, dar și foarte importantă. Imaginați-vă că nu se respectă executarea strict consecventă a operațiilor de scriere. Apoi, procesorul P1 poate scrie date către celulă, apoi procesorul P2 scrie în această celulă. Executarea strict secvențială a operațiilor de scriere garantează două consecințe importante pentru această secvență de operații de scriere. În primul rând, se asigură că fiecare procesor din aparat va observa la un moment dat înregistrarea efectuată de procesorul P2. Dacă secvența operațiilor de scriere nu este respectată, atunci poate apărea o situație când un procesor va observa mai întâi operația de scriere a procesorului P2 și apoi va scrie operația procesorului P1 și va stoca această valoare înregistrată P1 pe o perioadă nedeterminată. O problemă mai subtilă apare cu menținerea unui model rezonabil de ordine de execuție a programului și coerență a memoriei pentru utilizator: imaginați-vă că cel de-al treilea procesor citește în mod constant aceeași celulă de memorie în care scriu procesoarele P1 și P2; trebuie să observe mai întâi valoarea înregistrată de P1 și apoi valoarea înregistrată de P2. Poate că nu va putea niciodată să vadă valoarea înregistrată de P1, deoarece înregistrarea de la P2 a apărut înainte de citire. Dacă chiar vede valoarea înregistrată de P1, ar trebui să vadă valoarea scrisă de P2 în lectură ulterioară. În mod similar, orice alt procesor care poate monitoriza valorile scrise de ambele P1 și P2 trebuie să respecte același comportament. Cea mai simplă modalitate de a obține astfel de proprietăți este aceea de a respecta cu strictețe ordinea operațiilor de scriere, astfel încât toate înregistrările din aceeași celulă să poată fi observate în aceeași ordine. Această proprietate se numește execuție secvențială (serializare) a operațiilor de scriere (scrierea serializării). Întrebarea când un procesor ar trebui să vadă valoarea scrisă de un alt procesor este suficient de complexă și are un efect semnificativ asupra performanței, în special în mașinile mari. [13]
O alternativă la protocolul de returnare este să actualizați toate copiile elementului de date atunci când scrieți la acest element de date. Acest tip de protocol se numește un protocol de actualizare de scriere sau un protocol de difuzare de scriere. De obicei, în acest protocol, pentru a reduce cerințele privind lățimea de bandă, este util să monitorizăm dacă cuvântul din cache este un obiect partajat sau nu, și anume dacă acesta este conținut în alte cache-uri. Dacă nu, nu este nevoie să actualizați o altă memorie cache sau să transmiteți date actualizate către aceasta.
Diferența de performanță dintre protocoalele de înregistrare cu actualizare și cu anularea este determinată de trei caracteristici:
1. Multiplele secvențiale scrie la același cuvânt, care nu sunt intercalate cu operațiuni de citire, necesită mai multe operațiuni de traducere atunci când se utilizează protocolul de scriere de actualizare, ci doar o singură operație inițială de anulare când se utilizează protocolul de returnare.
2. În prezența blocurilor lungi în memoria cache fiecare cuvânt scris la unitatea de memorie cache, necesară atunci când se utilizează un protocol de difuzare a scrie actualizarea, în timp ce doar prima intrare la orice cuvânt în bloc trebuie să genereze operații de anulare, prin înregistrarea de protocol la anularea. înregistrarea protocolul de anulare funcționează la nivelul unităților de memorie cache, în timp ce protocolul de înregistrare de actualizare trebuie să funcționeze la nivelul cuvintelor individuale (sau bytes, dacă înregistrați un octet).
3. Întârzierea dintre înregistrarea vorbirii într-un singur procesor și citirea valorilor înregistrate de un alt procesor este de obicei mai puțin atunci când se utilizează schema de înregistrare de actualizare, deoarece datele înregistrate se traduce imediat la un procesor care efectuează citirea (se presupune că procesorul are o copie a datelor). Pentru comparație, folosind jurnalul înregistrează anularea într-un procesor, efectuează o citire, prima anulare se produce copii, atunci citirea se va face de date și suspendarea acestuia, atâta timp cât copia actualizată a blocului nu va fi disponibil și nu va reveni la procesor.