Конструирование критических регионов для процессов с использованием семафора и мьютекса (Hoare 1973) - PullRequest
1 голос
/ 02 марта 2012

Изучая основные понятия ОС, я наткнулся на этот код в разделе «Критические региональные конструкции на языках программирования высокого уровня».Это было дано Хоаром в 1973 году. Я искал в Интернете, но не смог найти никаких ссылок, касающихся этого.Я сомневаюсь, почему есть две очереди: первая задержка и вторая задержка?Будет ли работать только одна очередь?

Конструкция:

region x when (B) S;

С каждой общей переменной связаны следующие переменные:

semaphore mutex, first-delay, second-delay;
int first-count, second-count; 

Мьютекс семафора инициализируется равным 1;семафоры first-delay и second-delay инициализируются в 0. Целые числа first -count и second- count инициализируются в 0

код:

wait (mutex) ;
        while (!B) {
        first-count++;
        if (second-count > 0)
        signal (second-delay) ;
        else
        signal (mutex) ;
        wait (first-delay) ;
        first-count--;
        second-count++ ;
        if (first-count > 0)
        signal (first-delay) ;
        else
        signal(second-delay);
        wait (second-delay) ;
        second-count-- ;
    }
    S:
        if (first-count > 0)
        signal (first-delay) ;
        else if (second-count > 0)
        signal( second-delay) ;
        else
        signal(mutex);

1 Ответ

1 голос
/ 18 апреля 2017

Он рассчитан на две задержки, чтобы избежать частой проверки условия B. Поскольку предполагается, что на условие B влияет только S;следовательно, только когда выполняется S, мы должны еще раз проверить условие B. Остальные потоки застряли бы в first_delay of second_delay.

Конечно, только с одной задержкой код имел бы смысл.Попробуйте заменить все second_delay на first_delay и исключить тривиальные.Вы можете получить что-то вроде этого:

wait(mutex);
while (!B) {
    first_count++;
    if (first_count > 0)
        signal(first_delay);
    else
        signal(mutex);
    wait(first_delay);
    first_count--;
}
S;
if (first_count > 0)
    signal(first_delay);
else
    signal(mutex); 

В этом случае, однако, условие B будет проверяться снова и снова.

Посетите ЗДЕСЬ для получения более подробной информации!

...