N процессов и M типов процессов - вход и выход из cs - PullRequest
0 голосов
/ 03 августа 2009

Меня попросили написать: введите функцию и выйдите из функции для следующего случая:

существует N процессов и M типов процессов (N >> M) есть критическая секция, в которую могут войти все процессы одного типа. например: если тип A находится в cs, тип B не может ввести cs. но все процессы с типом A могут войти.

Я могу использовать только мьютекс и «тип», который является типом процесса. Тупик не допускается.

Как вы думаете, это нормально?

shared: this.type = -1;
mutex m, m1=1;

enter{
    down(m)
    if (this.type == process.type) up(m1)
    down(m1)
    this.type= process.type
    up(m)
}
exit {
    this.type = -1
    up(m1)
}

Спасибо! (кстати, это не HW. У меня есть экзамен, и я решаю тесты предыдущих лет)

Ответы [ 2 ]

0 голосов
/ 03 августа 2009

Я думаю о том, что вы говорите, и действительно я вижу проблему - 10X!

как насчет добавления счетчика? когда первый процесс того же типа введите, если счетчик == 0 type == process.type (инициализировать тип)

на выходе: counter-- и я проверю, если (count == 1) type = -1.

лучше ??

0 голосов
/ 03 августа 2009

Я бы сказал, нет, текущий метод не в порядке.

В частности, скажем, тип 0 входит и получает через ввод. Тип 1 затем проходит до выхода типа 0. Он попадает в мьютекс, обнаруживает, что тип процесса неверен, и блокируется на m1. Затем вводится тип 0, разблокируется m, сбрасывается тип процесса, и блокировка на m1 все еще действует.

Кроме того, если у вас есть 2 процесса типа 0 ввода, первый из них завершится, и тип запущенного процесса будет сброшен, пока процессы все еще находятся в критической секции.

Я предполагаю, что «вверх» похоже на разблокировку, а «вниз» похоже на блокировку; это звучит как набор методов, предназначенных для семафора. Я также делаю предположение, что для системы есть только два мьютекса (m и m1); поскольку разметка не совсем понятна в этом отношении.

РЕДАКТИРОВАТЬ: Предложение, которое вы предложили, будет выглядеть примерно так:

shared: this.type = -1;
mutex m, m1=1;
count=0;

enter{
    down(m)
    if (this.type == process.type) up(m1)
    down(m1)
    this.type= process.type
    count++;
    up(m)
}
exit {
    count--;
    if(count==0) this.type = -1
    up(m1)
}

Это все еще имеет проблему с тем, что выход не является потокобезопасным при изменении состояния; и что, когда новый Процесс пробуждается / начинает выполняться, его братья не пробуждаются.

Я не совсем уверен, что есть безопасный способ сделать это без условных переменных; если нет больше информации о проблеме. (т.е. это в контексте «Монитора», где выполнение метода уже поточно-ориентированное)

...