Рубрики

ВОРОТА | GATE-CS-2006 | Вопрос 78

Барьер — это конструкция синхронизации, в которой набор процессов синхронизируется глобально, т.е. каждый процесс в наборе достигает барьера и ожидает прибытия всех остальных, а затем все процессы покидают барьер. Пусть число процессов в наборе равно трем, а S — двоичный семафор с обычными функциями P и V. Рассмотрим следующую реализацию C барьера с номерами строк, показанными слева.

void barrier (void) {

1:   P(S);
2:   process_arrived++;
3.   V(S);

4:   while (process_arrived !=3);

5:   P(S);
6:   process_left++;

7:   if (process_left==3) {

8:      process_arrived = 0;
9:      process_left = 0;
10:  }
11:  V(S);
}

Переменные process_arrived и process_left являются общими для всех процессов и инициализируются нулями. В параллельной программе все три процесса вызывают функцию барьера, когда им требуется глобальная синхронизация.

Вышеуказанная реализация барьера неверна. Что из следующего верно?
(A) Неправильная реализация барьера из-за использования двоичного семафора S
(B) Реализация барьера может привести к тупику, если два барьера в
вызовы используются в непосредственной последовательности.
(C) Строки с 6 по 10 не обязательно должны находиться внутри критической секции.
(D) Реализация барьера правильна, если есть только два процесса вместо трех.

Ответ: (Б)
Объяснение: Возможно, что process_arrived станет больше 3. Невозможно, чтобы поступивший процесс снова стал равным 3, что означает тупик.
Тест на этот вопрос

Рекомендуемые посты:

ВОРОТА | GATE-CS-2006 | Вопрос 78

0.00 (0%) 0 votes