Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции / 3. IPC

.pdf
Скачиваний:
7
Добавлен:
15.02.2021
Размер:
13.89 Mб
Скачать

Ждущие

Режим интервального таймера, который перезапускается с заданной задержкой после каждого срабатывания объекта

Синхронизация в

Windows

 

 

 

 

 

ReleaseSemaphore

 

Увеличить счетчик семафора на 1

 

 

 

 

 

EnterCriticalSection

 

Установить блокировку на критической секции

 

 

 

 

 

LeaveCriticalSection

 

Снять блокировку с критической секции

 

 

 

 

 

WaitOnAddress

 

Блокироваться, пока не будет изменено значение памяти по указан-

 

 

ному адресу

 

 

 

 

 

 

 

 

WakeByAddressSingle

 

Возобновить выполнение первого потока, ожидающего изменения по

 

 

данному адресу

 

 

 

 

 

 

 

 

WakeByAddressAll

 

Возобновить выполнение всех потоков, ожидающих изменения по

 

 

данному адресу

 

 

 

 

 

 

 

 

CreateSemaphore

 

Создать новый семафор

 

 

 

 

 

CreateMutex

 

Создать новый мьютекс

 

 

 

 

 

OpenSemaphore

 

Открыть существующий семафор

 

 

 

 

 

OpenMutex

 

Открыть существующий мьютекс

 

 

 

 

 

WaitForSingleObject

 

Блокировать по одному семафору, мьютексу и т. д.

 

 

 

 

 

WaitForMultipleObjects

 

Блокировать по набору объектов, описатели которых заданы

 

PulseEvent

 

Установить событие сначала в сигнализированное, а затем в несигнализированное

 

 

состояние

 

 

 

 

ReleaseMutex

 

Освободить мьютекс, чтобы другой поток мог завладеть им

 

 

 

 

Синхронизация в Linux

Более ранние ядра системы Linux имели просто одну большую блокировку ядра (big kernel lock (BLK)). Это решение оказалось крайне неэффективным, особенно для многопроцессорных платформ (поскольку мешало процессам на разных процессорах одновременно выполнять код ядра). Поэтому было введено множество новых точек синхронизации (с гораздо большей избирательностью).

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

На самом нижнем уровне Linux предоставляет оболочки вокруг аппаратно поддерживаемых атомарных инструкций с помощью операций atomic_set и atomic_read. Кроме этого, поскольку современное оборудование изменяет порядок операций с памятью, Linux предоставляет барьеры памяти. Использование таких операций, как rmb и wmb, гарантирует, что все относящиеся к памяти операции чтения-записи, предшествующие вызову барьера, завершаются до любого последующего обращения к памяти.

Чаще используемые конструкции синхронизации относятся к более высокому уровню. Потоки, не желающие осуществлять блокировку (из соображений производительности или точности), используют обычные спин-блокировки, а также спин-блокировки по чтению-записи. В Linux реализуется так называемая билетная (Pcketbased) спин-блокировка, имеющая выдающуюся производительность на SMP и мультиядерных системах. Потоки, которым разрешено, или которые нуждаются в блокировке, используют такие конструкции, как мьютексы и семафоры. Для выявления состояния переменной синхронизации без блокировки Linux поддерживает неблокируемые вызовы, подобные mutex_trylock и sem_trywait. Поддерживаются и другие типы переменных синхронизации вроде фьютексов (futexes), завершений (complePons), блокировок «чтение — копирование — обновление» (read — copy — update (RCU)) и т. д. И наконец, синхронизация между ядром и кодом, выполняемым подпрограммами обработки прерываний, может также достигаться путем динамического отключения и включения соответствующих прерываний.

Барьеры

Барьерная синхронизация — метод синхронизации в распределённых вычислениях, при котором выполнение

параллельного алгоритма или его части можно разделить на несколько этапов, разделённых барьерами. В

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

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

Обмен данными между процессами и потоками

Конвейер (канал, pipe) – представляет собой буфер в оперативной памяти, поддерживающий очередь байт по алгоритму FIFO.

Именованные каналы

имеют имя, которое является записью в каталоге файловой системы ОС, поэтому пригодны для обмена данными между двумя произвольными процессами или потоками этих процессов

Безымянные каналы

записать данные в переполненный канал,

в Unix-подобных системах pipe() - создание канала read() – чтение, write() - запись close – закрыть канал

Именованные каналы

Соседние файлы в папке Лекции