ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ
31
return c; }
typedef struct {
lock t lock; /* байт статуса для каждого из двух процессов */
int count; /* какой из процессов будет следующим */
proc_t* head; /* */
proc_t* tail ) sema_t;}
Тупики
Процессы и потоки управления – активные объекты. Ресурсы – неактивные
объекты (процессор – вытесняемый ресурс, дисковое пространство – не вытесняе-
мый ресурс). Во время своей работы процесс (поток управления) может попасть в
два неприятных состояния: зависание и тупик.
Зависание
– состояние неопределенного ожидания, из которого рано или
поздно процессы выходят. Связано с ожиданием каких-либо ресурсов.
Тупик
– состояние ожидания некоторого события, которое никогда не про-
изойдет (как правило, это круговое ожидание ресурсов).
Система находится в тупиковой ситуации, если один или более процессов на-
ходятся в состоянии тупика.
Существуют четыре необходимых условия для возникновения тупика
[Цикритизис, Бернстайн 1977]:
•
условие взаимоисключения (процессы требуют монопольного владения ре-
сурсами, им предоставляемыми).
•
условие ожидания (процессы удерживают уже выделенные им ресурсы,
ожидая выделения дополнительных).
•
условие нераспределяемости (ресурсы нельзя отобрать у удерживающих их
процессов, пока они не будут использованы).
•
условие кругового ожидания (существует кольцевая цепь процессов, в
которой каждый процесс удерживает за собой один или более ресурсов,
требующихся следующему процессу).
Существует четыре основных стратегии работы с тупиками.
•
Полное игнорирование проблемы ("алгоритм страуса"). В большинстве
своем реальные операционные системы не осуществляют борьбу с тупика-
ми, поскольку ресурсов и так достаточно много.
•
Предотвращение тупиков (prevention) — подход, цель которого обеспече-
ние условий, исключающих возможность возникновения тупиковой
ситуации. Чтобы предотвратить тупик, достаточно нарушить хотя бы одно
необходимое условие.
o
первое условие (взаимоисключение) вполне естественно (например,
для такого устройства, как накопитель на магнитной ленте).