з

К предыдущей странице

л

К предыдущей главе

о

К следующей главе

и

К следующей странице


4.4.2. Алгоритм "Производитель-Потребитель" с буфером большого размера (бесконечным)

Производитель и Потребитель пользуются буфером большого размера, который представляет собой бесконечную очередь.

Действия: как только Производитель подготовит запись он добавляет ее в конец очереди. Как только Потребитель готов использовать запись он берет первую запись из начала очереди. Необходимо предусмотреть ситуацию чтобы Потребитель не читал из пустой очереди. Для этого необходимо хранить информацию о числе записей в очереди.

Алгоритм исполнения процессов "Производитель-Потребитель" с буфером большого размера:

GLB buffer

GLB namber(N)

N=0

CO{

Вызвать "Производитель"

Вызвать "Потребитель"

СО}

Описание (определение) процессов "Производитель- Потребитель" с буфером большого размера


MAKER USER
Local record
{
    make (record)
    add(record) to buffer
    {doit(N)
    (N:=N+1)}
}
Local record
{
    wait while (0     N--;
    get(record, buffer)
    use (record)
}
Свершить (doit(N))Ждать (wait(N))

Этот алгоритм некорректен по 2 причинам:

  • разделяемая переменная (число (N)) должна быть защищена от одновременного доступа;
  • отсутствует задержка процесса-производителя, что позволяет обоим процессам обращаться к указателям очереди одновременно.


Второй вариант этого алгоритма.

Введем необходимые взаимные исключения. Предположим, что "ждать" и "свершить" являются CS по отношению к числу (N), тогда все действия, связанные с событием "число (N)", выполняются в этих критических участках.

Алгоритм исполнения процессов "Производитель-Потребитель" с буфером большого размера (2-ой вариант)

GLB buffer

GLB namber(N)

SEMAPHORE (interexeption)

N=0

CO{

Вызвать MAKER

Вызвать USER

СО}

Описание (определение) процессов "Потребитель- Производитель" с буфером большого размера (2-ой вариант)


MAKER USER
Local record
{
    make (record)
    P(interexeption);
    Add(buffer, record);
    V(interexeption);
    Doit(N++);
}
Local record
{
    wait (0<N=N-1);
    P(interexeption);
    get(buffer, record);
    V(interexeption);
    Use(record);
}


Рис. 17. Временная диаграмма синхронизации процессов "Производитель-Потребитель"
с буфером большого размера


з

К предыдущей странице

л

К предыдущей главе

о

К следующей главе

и

К следующей странице