Sto cercando di capire l'algoritmo N-Process di Peterson e mi sono imbattuto in questa domanda.Cercando di capire l'algoritmo N-Process di Peterson
Domanda: Supponiamo 3 processi hanno ID di processo 0, 1 and 2
. Questi processi vengono eseguiti simultaneamente su un processore Uni e utilizzano l'algoritmo N-process di Peterson per controllare l'esecuzione della sezione critica. Ogni processo esegue il seguente pseudo codice:
lock(pid);
<critical section>;
unlock(pid
dove lock()
e unlock()
funzioni sono definiti come
lock(for Process i):
/* repeat for all partners */
for (count = 0; count < (NUMPROCS-1); count++) {
flags[i] = count;
turn[count] = i;
"wait until (for all k != i, flags[k]<count) or (turn[count] != i)"
}
Unlock (for Process i):
/* tell everyone we are finished */
flags[i] = -1;
Supponiamo lo stato del sistema in un dato momento è definita da <flags[0], flags[1], flags[2], turn[0], turn[1]>
valori e l'id il processo attualmente in esecuzione. Supponiamo inoltre che lo stato attuale del sistema sia <0,0,0,2,-1>
con il processo 0
attualmente in esecuzione. Mostra un modo particolare per i tre processi da eseguire fino al completamento a partire da questo stato. Mentre si traccia l'esecuzione simultanea di tre processi, mostrare lo stato del sistema ad ogni passaggio.
mie osservazioni
processi eseguiti contemporaneamente su un monoprocessore non possono eseguire sulla CPU contemporaneamente. Solo uno di questi può essere eseguito sulla CPU alla volta. Mentre un processo è in esecuzione sulla CPU, può eseguire qualsiasi parte del suo codice.
// NUMPROCS = 3
- Per i = 0
lock(for Process 0):
for (count = 0; count < 2; count++) {
flags[0] = count;
turn[count] = 0;
"wait until (for all k != 0, flags[k]<count) or (turn[count] != 0)"
}
Unlock (for Process 0):
flags[0] = -1;
- Per i = 1
lock(for Process 1):
for (count = 0; count < 2; count++) {
flags[1] = count;
turn[count] = 1;
"wait until (for all k != 1, flags[k]<count) or (turn[count] != 1)"
}
Unlock (for Process 1):
flags[1] = -1;
- Per i = 2
lock(for Process 2):
for (count = 0; count < 2; count++) {
flags[2] = count;
turn[count] = 2;
"wait until (for all k != 2, flags[k]<count) or (turn[count] != 2)"
}
Unlock (for Process 2):
flags[2] = -1;
La mia domanda è quella Dove iniziare a tracciare il codice? È dato che flags[0]=0, flags[1]=0, flags[2]=0, turn[0]=2, turn[1]=-1
ma come ci aiuterà a dove iniziare a tracciare il codice?
Se cominciamo a poco prima del ciclo for del processo
0
quindi tutti i valori di direzione verrebbero impostati su valori diversi diversi da ciò che è dato a noi.Se assumiamo eseguendo domanda significa processo
0
è nel suo sezione critica poi il ciclo for del prossimo processo imposterà i valori di direzione a qualcos'altro.
Perché ci vengono dati valori di stato e come può aiutarci a trovare da dove iniziare a tracciare il codice.
Sarebbe bello se avessi qualche suggerimento per aiutarmi a iniziare a tracciare il codice.
Grazie e scusa per la lunga domanda.