- •2. Теоретические основы построения операционных систем
- •Процессы и ресурсы
- •2.1.1. Определение процесса
- •Операционная система
- •П роцесс 1 Процесс 2 . . . Процесс n
- •2.1.2. Понятие ресурса
- •2.1.4. Планирование процессов
- •Центральный процессор
- •Центральный процессор
- •2.1.5. Классификация процессов
- •2.1.6. Классификация ресурсов
- •2.1.7. Структуры данных для управления процессами и ресурсами
- •2.1.8. Ядро операционной системы и реализация базовых функций ос
- •2.2. Проблема синхронизации и взаимное исключение
- •2.2.1. Определение и свойства критической секции
- •2.2.2. Программные методы реализации взаимного исключения
- •2.2.3. Синхронизация процессов с помощью семафоров
- •2.2.4. Реализация примитивов взаимоисключения
- •2.2.5. Параллельное программирование и мониторы
- •2.2.6. Рандеву как модель организации взаимодействия процессов
- •2.2.7. Система прохождения сообщений
- •2.2.8. Многозадачность и языки программирования
- •Взаимодействие процессов и синхронизация задач в os/2
- •2.2.10. Организация взаимодействия процессов и потоков в Win32
- •2.3. Проблема тупика
- •2.3.1. Определение тупика
- •Необходимые условия возникновения тупика и решение задачи предотвращения тупика
- •2.3.3. Модель системы для исследования проблемы тупика
- •2.3.4. Методы распознавания тупика
- •2.3.5. Выход из тупика и восстановление работоспособности системы
- •2.3.6. Методы обхода тупиков
2.3. Проблема тупика
Проблема тупика - одна из наиболее сложных проблем, решаемых при разработке программных систем в мультипрограммной среде.
Говорят, что процесс находится в состоянии тупика (дедлока или клинча), если он ожидает некоторого события, которое не может произойти без вмешательства извне, то есть если не будут приняты “чрезвычайные меры”. Например, процесс оказывается заблокированным в результате таких запросов на ресурсы, которые не могут быть удовлетворены, если не перераспределить принудительно ресурсы, “отобрав” их у других процессов, или не снять с выполнения эти процессы до нормального их завершения, процесс может быть также заблокирован в результате ожидания сигнала, который не может быть ему передан другим процессом.
Тупик может быть результатом ошибки при разработке программ для выполнения их в многопрограммной среде с динамическим распределением ресурсов.
Особенно большое значение решение проблемы тупика приобретает в системах реального времени, в вычислительных сетях.
Таким образом, проблема тупика - глобальная системная проблема, в рамках которой решаются следующие задачи:
предотвращение тупиков;
обход тупиков;
распознавание тупиков;
вывод системы из тупика и восстановление ее работоспособности.
Цель предотвращения тупика - создание таких условий функционирования системы, которые полностью исключают саму возможность возникновения тупика.
Задача обхода тупика решается в системах, где возможность возникновения тупика не исключается. Цель решения этой задачи - обход состояний, где вероятность возникновения тупика велика.
Задачи предотвращения и обхода тупиков иногда объединяют и рассматривают как единственную задачу предотвращения тупика. В действительности для решения этих задач используются разные методы: решение задачи предотвращения тупика основывается на знании необходимых условий возникновения тупика в системе, а решение задачи обхода тупика базируется на прогнозировании поведения системы путем распознавания возможности возникновения тупика на основе определения наличия в системе достаточных условий его возникновения.
Прогнозирование поведения системы при решении задачи обхода тупика основано на тех же методах, что и решение задачи распознавания тупика.
Если оказалось, что система все-таки попала в тупик, то необходимо уметь распознать эту ситуацию. Цель задачи распознавания тупика - установить сам факт возникновения тупиковой ситуации и определить объекты системы (процессы и ресурсы), вовлеченные в нее, то есть определить причины, приведшие к тупику.
При возникновении тупиковой ситуации ставится следующая задача - вывод системы из тупика с возможно меньшими потерями и восстановление ее работоспособности.
2.3.1. Определение тупика
Более точное определение тупика требует использования математической модели ВС.
Определим систему как пару
= { , },
где = {S1 , S2 , ...} - множество состояний системы, = { p1 , p2 , ...} - множество процессов, протекающих в системе.
В системе, которая определяется таким образом, процесс pi представляет собой частичную функцию, отображающую состояния системы в непустые подмножества ее же состояний:
pi : { }.
Процесс pi может быть определен не для всех состояний.
Если pi определен на состоянии Sl, то pi(Sl) - область его значений, то есть процесс pi может изменить состояние системы из Sl в состояние Sk pi(Sl ). Для перевода системы из состояния Sl в состояние Sk процесс должен выполнить некоторую операцию. Для обозначения перевода процессом pi системы из состояния Sl в состояние Sk введем обозначение
pi
Sl Sk.
Состояние системы может измениться только при выполнении процессом одной из следующих операций:
запрос на ресурс;
приобретение ресурса;
освобождение ресурса.
Введем еще одно обозначение: нотация
*
Sl Sn
означает
(a) Sl = Sn или
pi
(b) pi : Sl Sn или
pi *
(c) Sk & pi : (Sl Sk) & (Sk Sn).
То есть система может быть переведена из состояния Sl в состояние Sn посредством h операций (h 0), которые могут быть выполнены m различными процессами (m 0).
Используя введенные обозначения, определим состояние тупика.
Процесс pi заблокирован в состоянии Sl, если не существует ни одного такого состояния Sk , что
pi
Sl Sk .
То есть заблокированный процесс не может выполнить никакой операции по изменению состояния системы.
Процесс pi находится в тупике в состоянии Sl, если для любого состояния Sk, такого что
*
Sl Sk
процесс pi будет заблокирован в этом состоянии. То есть процесс находится в тупике в состоянии Sl, если он заблокирован в этом состоянии и останется заблокированным в любом другом состоянии Sk, в которое система может перейти из этого состояния Sl при выполнении любых операций любыми другими процессами (процесс останется заблокированным, как бы ни изменялось состояние системы в будущем).
Состояние Sl называется тупиковым, если существует процесс pi, находящийся в тупике в этом состоянии.
Состояние Sl называется безопасным, если любое состояние Sk, такое что
*
Sl Sk,
не будет состоянием тупика.
Система может быть представлена в виде графа, вершины которого соответствуют состояниям системы, а дуги показывают возможные переходы системы из одного состояние в другое при выполнении процессами перечисленных выше операций.
Рассмотрим пример системы, в которой есть как тупиковое, так и безопасное состояние. Пусть = {S1, S2, S3, S4, S5} - множество состояний системы, = {p1, p2} - множество выполняющихся в ней процессов (рис.2.9).
p1 p2
p2 p1
S 1 S2 p1 S3 S4 p1 S5
Р ис.2.9. Пример системы с тупиковым и безопасным состоянием
Состояние S1 является состоянием тупика. Состояния S4 и S5 являются безопасными состояниями. Состояния S2 и S3 не являются безопасными состояниями, но не являются и тупиковыми.