Программно-технический комплекс Учебное пособие Новочеркасск юргту (нпи) 2010. Удк 519. 23 (075. 8) Ббк 22. 17я73

Вид материалаУчебное пособие

Содержание


1.6. Синхронизация задач
Разделяемая память
Сигналы (signal
Почтовые ящики
Событие (event
События, переводимые в несигнальное состояние автоматически
События, переводимые в несигнальное состояние вручную
Подобный материал:
1   2   3   4   5   6   7   8   9   10   ...   52

1.6. Синхронизация задач


Хотя каждая задача в системе выполняет какую-либо отдельную функцию, часто возникает необходимость в согласовании (синхронизации) действий, выполняемых различными задачами. Механизм, обеспечивающий процесс синхронизации, называется ограничением доступа. При этом имеется два общих состояния, в которых может находиться задача. Во-первых, задача может выполняться (или быть готовой к выполнению, как только получит доступ к ресурсам процессора). Во-вторых, задача может быть блокирована. В этом случае ее выполнение приостановлено до тех пор, пока не освободится нужный ей ресурс или не произойдет определенное событие. Такая синхронизация необходима в следующих случаях:
  1. Функции, выполняемые задачами, связаны друг с другом.
  2. Необходимо упорядочить доступ нескольких задач к разделяемому ресурсу2.
  3. Необходима синхронизация задачи с внешними событиями, для чего используется механизм прерываний.
  4. Необходима синхронизация задачи по времени, для чего используются специальные аппаратные средства – таймеры.

Рассмотрим все четыре случая более подробно.

Связные задачи. Межпроцессное взаимодействие – это тот или иной способ передачи информации из одного процесса в другой. Наиболее распространенными формами взаимодействия являются:
  1. Разделяемая память – два или более процесса могут иметь доступ к одному и тому же блоку памяти. В системах с виртуальной памятью организация такого вида взаимодействия требует поддержки со стороны ОС, поскольку необходимо отобразить соответствующие блоки виртуальной памяти на один и тот же блок физической памяти.
  2. Семафоры – это объекты синхронизации, задающие количество пользователей (задач, процессов), имеющих одновременный доступ к некоторому ресурсу.
  3. Сигналы (signal) – это сообщения, доставляемые посредством ОС процессу. Процесс должен зарегистрировать обработчик этого сообщения у ОС, чтобы получить возможность реагировать на него. Часто ОС извещает процесс сигналом о наступлении какого-либо сбоя.
  4. Почтовые ящики (mail box) – это очередь сообщений (обычно – тех или иных структур данных), которые помещаются в почтовый ящик процессами и/или ОС. Несколько процессов могут ждать поступления сообщения в почтовый ящик и активизироваться по поступлению сообщения. Требует поддержки со стороны ОС.

5. Событие (event) – это логический сигнал (оповещение), приходящий асинхронно по отношению к процессу со стороны ОС о той или иной форме межпроцессного взаимодействия, например, о принятии семафором нужного значения, наличии сигнала, о поступлении сообщения в почтовый ящик. Можно выделить:
  • События, переводимые в несигнальное состояние автоматически (автосброс). Такое событие переключается в несигнальное состояние ОС, когда один из ожидающих его потоков завершится (wait-функция вернула управление потоку).
  • События, переводимые в несигнальное состояние вручную. Такое событие, будучи установленным в сигнальное состояние, остается в нем пока не будет явно переключено вызовом функции ResetEvent (очистить). Причем «сигнальное состояние» соответствует значению 1 для переменной события, «несигнальное состояние» – 0. Так как события являются объектами синхронизации ядра, то перед использованием событие должно быть создано.
  • Управление периодическим процессом с помощью событий.

6. Прокси (proxy) – это форма неблокирующего сообщения, когда посылающий процесс не нуждается в диалоге с получателем. Единственная функция прокси состоит в посылке фиксированного сообщения определенному процессу, который является владельцем прокси.

Взаимное согласование задач с помощью сообщений3 является важнейшим принципов ОСРВ. Объем информации, передаваемой в сообщении, может меняться от одного бита до всей свободной емкости памяти системы. Компоненты ОС как и пользовательские задачи способны принимать и передавать сообщения. Сообщения бывают асинхронными и синхронными. В первом случае доставка сообщений задаче производится после того, как она в плановом порядке получит управление, а во втором случае циркуляция сообщений оказывает непосредственное влияние на планирование задач. Иногда сообщения передаются через буфер определенного размера (почтовый ящик). При этом новое сообщение затирает старое, даже если последнее не было обработано. Сообщение может содержать как сами данные, предназначенные для передачи, так и указатель на такие данные. При этом обмен производится с помощью разделяемых областей памяти, разделяемых файлов и т.п.

Общие ресурсы. Ресурс – это общий термин, описывающий физическое устройство или область памяти, которые могут одновременно использоваться только одной задачей. Ресурсы разделяют на:
  • активные – способны изменить информацию (процессор);
  • пассивные – способны хранить информацию;
  • локальные – принадлежат одному процессу; время жизни совпадает с временем жизни процесса;
  • разделяемые – используются несколькими процессами и существуют, пока есть хоть один процесс, который их использует;
  • постоянные – используются посредством операций «захватить» и «освободить»;
  • временные – используются посредством «создать» и «удалить».

Разделяемые ресурсы бывают:
  • не критичные – используются одновременно несколькими процессами;
  • критичные – используются одним процессом, и пока этот процесс не завершит работу с ресурсом, последний не доступен другим процессам (разделяемая память, доступная на запись).

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

Иногда может возникнуть ситуация, когда одна задача не вовремя прерывает другую, от которой зависит правильность выполнения исходной задачи (например, вытесняемая задача собирает информацию, которую использует вытесняющая задача). Упомянутые проблемы обусловлены времязависимыми ошибками (time dependent error), или гонками, и характерны для многозадачных ОС, применяющих алгоритмы планирования с вытеснением (кстати, системы с разделением времени также относятся к категории вытесняющих). Ошибки, обусловленные гонками: а) характерны для работы с любыми ресурсами, доступ к которым имеют несколько задач; б) происходят только в результате совпадения определенных условий, а потому с трудом обнаруживаются на этапе отладки.

Возможные пути решения этой проблемы:
  • Не использовать алгоритм планирования задач с вытеснением, что не всегда приемлемо.
  • Использовать специальный сервер ресурса, ответственный за упорядочивание доступа к ресурсу, а запрос на изменение значения глобальных данных посылается этому серверу в виде сообщения.
  • Запретить прерывания на время доступа к разделяемым данным.
  • Использовать для упорядочивание доступа к глобальным данным семафоры.

Синхронизация с внешними событиями. Применение аппарата прерываний является более эффективным методом взаимодействия с внешним миром, чем метод опроса. При этом можно проследить следующие тенденции:
  • попытка обеспечить максимально быструю и детерминированную реакцию системы на внешнее событие;
  • стремление добиться минимально возможных периодов времени, когда в системе запрещены прерывания;
  • подпрограммы обработки прерываний выполняют минимальный объем функций за максимально короткое время. Это обусловлено несколькими причинами. Во-первых, не все ОСРВ обеспечивают возможность “вытеснения” во время обработки подпрограмм прерывания. Во-вторых, приоритеты аппаратных прерываний не всегда соответствуют приоритетам задач, с которыми они связаны. В-третьих, задержки с обработкой прерываний могут привести к потере данных.

Закончив необходимые действия, подпрограмма обработки прерываний генерирует сообщение для задачи, с которой это прерывание связано, и немедленно возвращает управление. Если это сообщение привело задачу в разряд готовых к исполнению, планировщик в зависимости от используемого алгоритма и приоритета задачи принимает решение о том, необходимо или нет немедленно передать управление получившей сообщение задаче.

Синхронизация по времени. В ОСРВ задается эталонный интервал (квант) времени (тик (Tick)), который используется в качестве базовой единицы измерения времени. Размерность этой единицы для разных ОСРВ может быть разной, как разными могут быть набор функций и механизмы взаимодействия с таймером. Функции по работе с таймером используют для приостановки выполнения задачи на какое-то время, для запуска задачи в определенное время, для относительной синхронизации нескольких задач по времени и т.п. Для точной синхронизации таймера вычислительной системы с астрономическим временем могут применяться специальные часы с подстройкой по радиосигналам точного времени или навигационные приемники GPS.