Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_na_voprosy_SPO_2.docx
Скачиваний:
4
Добавлен:
01.05.2025
Размер:
4.28 Mб
Скачать

53.Задача «производитель/потребитель». Реализация на бесконечном буфере.

Реализация на кольцевом буфере.

  • Один или несколько процессов-производителей помещают данные в общий буфер.

  • Процесс-потребитель извлекает данные из буфера

  • Должна выполнятся задача критической секции при доступе к буферу со стороны производителей и потребителей

Производитель

producer:

while (true) {

/* produce item v */

b[in] = v;

in++;

}

Потребитель

consumer:

while (true) {

while (in <= out)

/*do nothing */;

w = b[out];

out++;

/* consume item w */

}

Задача производителя/потребителя

Производитель с кольцевым буфером

producer:

while (true) {

/* produce item v */

while ((in + 1) % n == out) /* do nothing */;

b[in] = v;

in = (in + 1) % n

}

Потребитель с круговым буфером

consumer:

while (true) {

while (in == out)

/* do nothing */;

w = b[out];

out = (out + 1) % n;

/* consume item w */

}

Конечный кольцевой буфер в задаче ПП

54.Задача «читатели-писатели».

  • Несколько процессов могут одновременно читать данные из общей области памяти.

  • Только один процесс в каждый момент времени может писать в общую область памяти.

  • Процессы-читатели не могут читать данные, если происходит запись в общую область памяти.

Первая проблема читателей-писателей (приоритет читателя)

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

Вторая проблема читателей-писателей (приоритет писателя)

Как только появился хоть один писатель, читателей больше не пускать. При этом читатели могут простаивать.

Примерное решение:[1]

Глобальные целые readcount=0, writecount=0;

Глобальные мютексы mutex1, mutex2, mutex3, w, r

ЧИТАТЕЛЬ

mutex3.enter

r.enter

mutex1.enter

readcount = readcount + 1

if readcount=1 then w.enter

mutex1.leave

r.leave

mutex3.leave

...читаем...

mutex1.enter

readcount = readcount - 1

if readcount = 0 then w.leave

mutex1.leave

ПИСАТЕЛЬ

mutex2.enter

writecount = writecount + 1

if writecount=1 then r.enter

mutex2.leave

w.enter

...пишем...

w.leave

mutex2.enter

writecount = writecount - 1

if writecount = 0 then r.leave

mutex2.leave

Третья проблема читателей-писателей

(честное распределение ресурсов)

Не допускать простоев. Другими словами:

независимо от действий других потоков

, читатель или писатель должен пройти барьер за конечное время.

Глобальные мютексы: no_writers, no_readers, counter_mutex

Глобальные целые: nreaders=0

Локальные целые: prev, current

ПИСАТЕЛЬ:

no_writers.enter

no_readers.enter

no_writers.leave

...пишем....

no_readers.leave

ЧИТАТЕЛЬ:

no_writers.enter

counter_mutex.enter

prev := nreaders

nreaders := nreaders + 1

counter_mutex.leave

if prev = 0 then no_readers.enter

no_writers.leave

...читаем...

counter_mutex.enter

nreaders := nreaders - 1;

current := nreaders;

counter_mutex.leave;

if current = 0 then no_readers.leave

В обоих фрагментах псевдокода, если есть атомарные операции наподобие InterlockedIncrement/InterlockedDecrement, от мютексов, охраняющих счётчики, можно избавиться.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]