Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция_Realtime_2.doc
Скачиваний:
221
Добавлен:
14.02.2015
Размер:
611.33 Кб
Скачать
      1. Синхронизация

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

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

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

Средства ожидания и сообщения реализованы в исполнительной системе NTкак часть объектной архитектуры.Синхронизационные объекты (synchronization objects) —это объекты исполнительной системы, при помощи которых поток синхронизирует свое выполнение. К их числу относятся следующие объекты:

  • Процесс

  • Поток

  • Файл

  • Событие

  • Пара событий

  • Семафор

  • Таймер

  • Мутант *

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

В любой момент времени синхронизационный объект находится в одном из двух состояний: свободен (signaled state)либозанят (nonsignaled state). Состояние "свободен" определено по-разному для разных объектов. Объект-поток находится в состоянии "занят" все время существования, но устанавливается системой в состояние "свободен", когда его выполнение завершается. Ана­логично, ядро устанавливает процесс в состояние "свободен", когда завершает­ся его последний поток. В противоположность этому, объект-таймер "сраба­тывает" через заданное время (по истечении этого времени ядро устанавливает объект-таймер в состояние "свободен").

Для синхронизации с объектом поток вызывает один из системных сер-висов ожидания, предоставляемых диспетчером объектов, и передает описа­тель данного объекта. Поток может ждать один или несколько объектов, а так­же задать отмену ожидания, если оно не закончилось за некоторый промежу­ток времени. Всякий раз, когда ядро устанавливает объект в состояние "свобо­ден", оно проверяет, есть ли потоки, ожидающие этот объект. Если такие пото­ки есть, то ядро выводит один или несколько из них из состояния ожидания, и они могут продолжить выполнение.

При выборе механизма синхронизации следует учитывать правила, уп­равляющие поведением различных синхронизационных объектов. Закончится ли ожидание потока, когда объект, у которого он ждет, будет переведен в со­стояние "свободен", зависит от типа объекта, как показано в табл.2—1.

Таблица 2-1. Определения состояния "свободен"

В большинстве случаев, когда объект устанавливается в состояние "сво­боден", все ожидающие потоки немедленно освобождаются. Например, объект-событие используется для оповещения о том, что произошло некото­рое событие. Когда объект-событие устанавливается в состояние "свободен", все ожидающие его потоки освобождаются. Исключением является поток, ожидающий одновременно более одного объекта; такому потоку, возможно, потребуется продолжать ожидание до тех пор, пока и остальные объекты не станут" свободными.