Механизмы синхронизации: семафор, мьютекс, монитор, критическая секция
Семафоры
В 1965 году Дейкстра (E.W. Dijkstra) предложил использовать целую переменную для подсчета
сигналов запуска, сохраненных на будущее. Им был предложен новый тип переменных, так
называемые семафоры, значение которых может быть или некоторым положительным числом, соответствующим количеству отложенных активизирующих сигналов.
Семафор может управлять количеством процессов, которые имеют к нему доступ. Он
устанавливается на предельное количество процессов, которым доступ разрешен. Когда это число
достигнуто, последующие процессы будут приостановлены, пока один или более процессов не отсоединятся от семафора и не освободят доступ.
Мьютексы
Иногда используется упрощенная версия семафора, называемая мьютексом (mutex, сокращение
от mutual exclusion – взаимное исключение). Мьютекс не способен считать, он может лишь
управлять взаимным исключением доступа к совместно используемым ресурсам или кодам.
Реализация мьютекса проста и эффективна, что делает использование мьютексов особенно
полезным в случае потоков, действующих только в пространстве пользователя.
Мьютекс – переменная, которая может находиться в одном из двух состояний: блокированном
или неблокированном. Поэтому для описания мьютекса требуется всего один бит, хотя чаще
используется целая переменная, у которой 0 означает неблокированное состояние, а все
остальные значения соответствуют блокированному состоянию. Значение мьютекса
устанавливается двумя процедурами. Если поток (или процесс) собирается войти в критическую
область, он вызывает процедуру mutex_lock.
Критические секции(critical section) подобны мьютексам, однако между ними существуют два
важных отличия:
мьютексы могут быть совместно использованы в различных процессах;
если критическая секция принадлежит другому процессу, ожидающий процесс
блокируется вплоть до освобождения критической секции; в отличие от этого, мьютекс
разрешает продолжение по истечении тайм-аута.
Критические секции и мьютексы очень схожи. На первый взгляд, выигрыш от использования
критической секции вместо мьютекса не очевиден. Критические секции, однако, более
эффективны, чем мьютексы, так как используют меньше системных ресурсов. Мьютексы могут
быть установлены на определенный интервал времени, по истечении которого выполнение
продолжается; критическая секция всегда ждет столько, сколько потребуется.
Способы организации межпроцессного взаимодействия (IPC), их достоинства и недостатки
Межпроцессное взаимодействие (англ. inter-process communication, IPC) — обмен данными между потоками одного или разных процессов. Реализуется посредством механизмов, предоставляемых ядром ОС или процессом, использующим механизмы ОС и реализующим новые возможности IPC. Может осуществляться как на одном компьютере, так и между несколькими компьютерами сети.
Каналы (pipes): виды, особенности реализации в ОС семейства Windows и в ОС семейства Linux
В программировании именованный канал или именованный конвейер (англ. named pipe) — один из методов межпроцессного взаимодействия, расширение понятия конвейера в Unix и подобных ОС. Именованный канал позволяет различным процессам обмениваться данными, даже если программы, выполняющиеся в этих процессах, изначально не были написаны для взаимодействия с другими программами. Это понятие также существует и в Microsoft Windows, хотя там его семантика существенно отличается. Традиционный канал — «безымянен», потому что существует анонимно и только во время выполнения процесса. Именованный канал — существует в системе и после завершения процесса. Он должен быть «отсоединён» или удалён, когда уже не используется. Процессы обычно подсоединяются к каналу для осуществления взаимодействия между ними.
Именованные каналы
В Windows дизайн именованных каналов смещён к взаимодействию «клиент-сервер», и они работают во многом как сокеты: помимо обычных операций чтения и записи, именованные каналы в Windows поддерживают явный «пассивный» режим для серверных приложений (для сравнения: сокет домена UNIX). Windows 95 поддерживает клиенты именованных каналов, а системы ветви Windows NT могут служить также и серверами.
К именованному каналу можно обращаться в значительной степени как к файлу. Можно использовать функции Windows API CreateFile, CloseHandle, ReadFile, WriteFile, чтобы открывать и закрывать канал, выполнять чтение и запись. Функции стандартной библиотеки Си, такие, как fopen, fread, fwrite и fclose, тоже можно использовать, в отличие от сокетов Windows (англ.), которые не реализуют использование стандартных файловых операций в сети. Интерфейс командной строки (как в Unix) отсутствует.
Именованные каналы — не существуют постоянно и не могут, в отличие от Unix, быть созданы как специальные файлы в произвольной доступной для записи файловой системе, но имеют временные имена (освобождаемые после закрытия последней ссылки на них), которые выделяются в корне файловой системы именованных каналов (англ. named pipe filesystem, NPFS) и монтируются по специальному пути «\\.\pipe\» (то есть у канала под названием «foo» полное имя будет «\\.\pipe\foo»). Анонимные каналы, использующиеся в конвейерах, — это на самом деле именованные каналы со случайным именем.