22 noiembrie 2011

Simularea protocolului MESI in C


<--- schema pentru protocolul Mesi cu invalidare pentru memoria cache de tip "write back"

MESI = initialele celor 4 stari ale memoriilor cache asociate unor procesoare (Modified, Exclusive, Shared, Invalid)

Invalid -> la inceputul rularii toate cache-urile sunt "I" sau atunci cand un procesor face scriere pe propriul cache, rezulta celelalte cache-uri devin "I"

Exclusive -> cand se aduc datele din memoria principala intr-una dintre memoriile cache (celelalte cache-uri fiind pe starea "I")

Modified -> dupa fiecare write al unui procesor, memoria cache asociata devine "M" (si restul "I")

Shared -> dupa ce o memorie cache isi imparte datele cu o alta, indiferent cum erau inainte, ambele ajung in starea "S"

Simularea de mai jos este relativ simplista, nu afiseaza actiunea pe magistrala (BusRd, Flush, etc) si nici informatii despre sursa de date, ci doar starile succesive ale cache-urile asociate procesoarelor.

#include "stdio.h"
#include "stdlib.h"
#define N 3

char s[N];
int mem[N*4] = {1,0,1,0,0,1,1,0,1,1,0,1};
int cache[N][N], n;

void operatie (int p, char *op) {

int i;

if (*op == 'w') {
s[p] = 'M';
for (i=0; i < N; i++)
if (i != p)
s[i] = 'I';
goto afisare;
}
if (*op == 'r') {
if (s[p] == 'M' || s[p] == 'E')
goto afisare;
if (s[p] == 'I') {
int flag = 1;
for (i=0; i < N; i++)
if (s[i] != 'I')
flag = 0;
if (flag == 1) {
s[p] = 'E';
goto afisare;
}
for (i=0; i < N; i++)
if (s[i] == 'E' || s[i] == 'S' || s[i] == 'M')
s[i] = 'S';
s[p] = 'S';
}
goto afisare;
}
afisare:
for (i=0; i < N; i++)
printf("%c ", s[i]);
printf("\n");
}

int main () {

char *op = (char*) malloc (sizeof (char));
int i, j;
for (i=0; i < N; i++) {
for (j=0; j < N; j++)
cache[i][j] = 0;
s[i] = 'I';
}
printf("n=");
scanf("%d", &n);
printf("initial\n");
for (i=0; i < N; i++)
printf("%c ", s[i]);
printf("\n");
for (i=0; i < n; i++) {
int proc;
printf("P=");
scanf ("%d", &proc);
printf("op=");
scanf ("%s", op);
operatie (proc-1, op);
}

return 0;

}

Pentru test se poate folosi secventa:

Se citesc: n (numarul de operatii, 8) , P (indicele procesorului, 1..3) si operatia (r/w)
Sunt afisate cele N = 3 stari dupa fiecare pas.

Niciun comentariu: