Борьба с тупиками

 

Тупик - это состояние процесса в ожидании события, которое не произойдет. При этом ОС "зависает", что особо недопустимо для систем реального времени.

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

Тупики возникают при наличии четырех необходимых условий:

- требование монопольного использования ресурса, т.е. взаимоисключение при использовании ресурса;

- ожидание дополнительных ресурсов, удерживая уже выделенные;

- неперераспределяемость ресурса;

- круговое ожидание ресурсов.

Основные направления борьбы с тупиками:

- Предотвращение тупиков

- Обход тупиков

- Обнаружение тупиков с дальнейшей нейтрализацией

 

Понятие событийного программирования [1 c. 69 – 88; 2 разд. 4.1–4.4]

 

ОС Windows и ее приложения представляют собой программы, управляемыесобытиями (или сообщениями - message). Последовательность их действий определяется очередью сообщений о событиях. В Windows есть системная очередь сообщений иочередь сообщенийдлякаждогоприложения.

Сообщения драйверов устройств о событиях низкого уровня (нажатии/отпускании клавиши на клавиатуре или кнопки мыши, перемещении мыши) поступают в системную очередь. На их основе Windows передает каждому приложению сообщения обо всех касающихся его событиях пользовательского интерфейса: нажатии в его окне экранной кнопки или выборе строки меню с определенным идентификатором (номером), срабатывании таймера, необходимости перерисовать окно при передвижении окон и т. п. Приложения могут посылать сообщения друг другу (и себе). В ответ на сообщение приложение выполняет соответствующие действия.

Windows сама привязывает мышь и клавиатуру к органам пользовательского интерфейса приложения: иконкам (пиктограммам), окнам, меню, экранным кнопкам, линейкам прокрутки, курсорам, панелям диалога. Приложение избавлено от необходимости отслеживать текущие координаты объектов интерфейса и мыши, коды нажимаемых клавиш или участвовать в выполнении стандартных команд системного меню своего окна.

Упрощенно говоря, например, информация "Кнопка мыши отпущена в точке экрана с координатами (50, 100)" подается приложению в виде "Выбран пункт 5 меню 1 окна 2".

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

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

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

Система многозадачного планирования Windows также встроена в ее механизм доставки сообщений.

Пользователь может запустить сразу несколько программ (Windows-приложений). Каждая программа должна создать собственное главное окно приложения со стандартным для Windows-приложений графическим интерфейсом и организовать обработку сообщений Windows.

 

Средства коммуникации процессов [1 c. 31–39, 93 – 98, 104–110; 2 3.4.2–3.4.3]

 

Сообщения, сигналы, семафоры, в Windows XP – объекты ядра event (событие) и др. позволяют синхронизировать действия процессов.

Взаимодействие между процессами подразумевает не только синхронизацию их действий, но и обмен сообщениями.

Место для хранения посланного, но не полученного сообщения называется почтовым ящиком. Достоинства почтовых ящиков:

- Процесс не знает о других процессах, пока не получит сообщение от них

- Процесс, отправив сообщение, продолжает работу, не обращая внимания на получателя.

Основной недостаток – это появление еще одного ресурса, которым также нужно управлять.

Другой способ обмена данными между процессами - программный канал связи (конвейер). Передающая данные задача как будто записывает их потоками байтов в файл, а получающая – читает из файла. На самом деле конвейер – это не файл на диске, а буферная память, работающая по принципу FIFO (очередь в виде циклического вектора фиксированного размера не более 64 Кбайт).

Наиболее удобный метод связи между взаимодействующими процессами – очереди сообщений. Несколько процессов – клиентов могут посылать сообщения процессу- приемнику. Только процесс-приемник может их читать и удалять из очереди. Для двухсторонней связи используются две очереди. Можно применить разные дисциплины обработки очереди: FIFO, LIFO, по приоритету, произвольно. В очереди хранится не само сообщение, а его адрес в памяти. Сообщения можно не удалять из очереди, а читать несколько раз.