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

16. Взаимное искл. С активным ожиданием. Алгоритм Петерсона. Недост. Алгоритмов с активным ожиданием. (Лекция 4)

См. вопрос 15!!! Недостатки алгоритмов с активным ожиданием:

Недостатки активного ожидания:

- расход времени процессора;

- проблема инверсии приоритетов (процесс с низким приоритетом не дает войти в критическую область процессу с высоким приоритетом).

Решение проблемы потребления ресурсов ЦПУ – временная блокировка ожидающего процесса и вывод его из очереди с состоянием «Готов».

Запрещение прерываний: Если произойдет сбой процесса, то он не сможет снять запрет на прерывания.

Строгое чередование:

- Заблокированный процесс постоянно находится в цикле, проверяя, не изменилась ли переменная.

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

Алгоритм Петерсона: расходуется бесцельно время процессора на циклы проверки изменения переменной.

17. Решение задачи о производителях и потребителях с помощью примитивов (функций ядра) блокирования и запуска процессов. (Лекция 4)

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

Хранилище сообщений представляет собой общий разделяемый ресурс, и его использование д/б построено по правилам взаимоисключения. Также, надо учитывать, что потребление ресурса иногда может оказаться невозможным (отсутствие сообщений в хранилище), а при добавлении сообщений в хранилище могут происходить задержки (в случае полного заполнения хранилища).

П усть имеется возможность заблокировать процесс – примитив ядра sleep(номер процесса); и возможность запустить его – примитив wakeup(номер процесса). Примитив sleep - системный запрос, в результате которого вызывающий процесс блокируется, пока его не запустит другой процесс. У запроса wakeup есть один параметр - процесс, который следует запустить. Также возможно наличие одного параметра у обоих запросов - адреса ячейки памяти, используемой для согласования запросов ожидания и запуска.

Два процесса совместно используют буфер ограниченного размера. Один из них, производитель, помещает данные в этот буфер, а другой, потребитель, считывает их оттуда.

Трудности начинаются в тот момент, когда производитель хочет поместить в буфер очередную порцию данных и обнаруживает, что буфер полон. Для производителя решением является ожидание, пока потребитель полностью или частично не очистит буфер. Аналогично, если потребитель хочет забрать данные из буфера, а буфер пуст, потребитель уходит в состояние ожидания и выходит из него, как только производитель положит что-нибудь в буфер и разбудит его. Это решение кажется достаточно простым, но оно приводит к состояниям состязания. Нужна переменная count для отслеживания количества элементов в буфере. Если максимальное число элементов, хранящихся в буфере, равно N, программа производителя должна проверить, не равно ли N значение count прежде, чем поместить в буфер следующую порцию данных. Если значение count равно N, то производитель уходит в состояние ожидания; в противном случае производитель помещает данные в буфер и увеличивает значение count. Код программы потребителя: сначала проверить, не равно ли значение count нулю. Если равно, то уйти в состояние ожидания; иначе забрать порцию данных из буфера и уменьшить значение count. Каждый из процессов также должен проверять, не следует ли активизировать другой процесс, и в случае необходимости проделывать это.