Я пытаюсь понять алгоритм N-процесса Петерсона, и я столкнулся с этим вопросом.Попытка понять алгоритм N-процесса Петерсона
Вопрос: Пусть 3 процессы имеют идентификаторы процессов 0, 1 and 2
. Эти процессы выполняются одновременно на уни-процессоре и используют алгоритм N-процесса Петерсона для управления выполнением критического раздела. Каждый процесс выполняется следующий код псевдо:
lock(pid);
<critical section>;
unlock(pid
, где lock()
и unlock()
функции, как определено
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;
Предположим, что состояние системы в любой момент времени определяется <flags[0], flags[1], flags[2], turn[0], turn[1]>
значений и идентификатор выполняемый в настоящее время процесс. Предположим далее, что текущее состояние системы составляет <0,0,0,2,-1>
с процессом 0
Выполняется в настоящее время. Покажите один конкретный путь для запуска трех процессов, начиная с этого состояния. Когда вы отслеживаете одновременное выполнение трех процессов, покажите состояние системы на каждом шаге.
Мои наблюдения
Процессы, работающие одновременно на однопроцессорной не может выполняться на процессоре одновременно. Одновременно может выполняться только один из них. Пока процесс выполняется на процессоре, он может выполнять любую часть своего кода.
// NUMPROCS = 3
- Для 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;
- Для 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;
- Для 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;
Мой вопрос в том, что С чего начать отслеживание кода? Дано, что flags[0]=0, flags[1]=0, flags[2]=0, turn[0]=2, turn[1]=-1
, но как это поможет нам, где начать отслеживать код?
Если мы начинаем непосредственно перед цикл процесса
0
то все значения поворота будет установлен, кроме того, что дано нам различные значения.Если мы предположим, выполнив вопрос означает, что процесс
0
в это критический участок, то цикл следующего процесса установит значения поворота к чему-то еще.
Почему им даются данные о состоянии и как это может помочь нам найти, с чего начать отслеживание кода.
Было бы здорово, если бы я получил подсказку, чтобы помочь мне начать отслеживание кода.
Спасибо и простите за длинный вопрос.