Что такое Semaphore? Подсчет, двоичные типы с примером
⚡ Умное резюме
Semaphore В операционной системе это неотрицательная целочисленная переменная, разделяемая между потоками, которая координирует доступ к общим ресурсам посредством двух атомарных операций: ожидания и сигнализации, предотвращая состояния гонки во время синхронизации процессов.

Что такое Semaphore?
Semaphore это просто переменная, которая неотрицательна и разделяется потоками. Семафор — это механизм сигнализации, и поток, ожидающий семафора, может быть просигнализирован другим потоком. Он использует две атомарные операции: 1) Ожидание и 2) Signal для синхронизации процессов.
Семафор либо разрешает, либо запрещает доступ к ресурсу, в зависимости от того, как он настроен.
Характеристики Semaphore
Вот характеристики семафора:
- Это механизм, который можно использовать для синхронизации задач.
- Это механизм синхронизации низкого уровня.
- Semaphore всегда будет содержать неотрицательное целое значение.
- Semaphore может быть реализовано с использованием тестовых операций и прерываний, которые должны выполняться с использованием файловых дескрипторов.
Виды Semaphores
Существует два распространенных типа семафоров:
- Подсчет семафоров
- Бинарные семафоры
Подсчет Semaphores
Этот тип Semaphore Используется счетчик, который помогает многократно получать или освобождать задачу. Если начальное значение счетчика равно 0, счетчик должен быть создан в недоступном состоянии.
Однако если счетчик > 0, семафор создается в доступном состоянии, и количество имеющихся у него токенов равно его счетчику.
Двоичный Semaphores
Бинарные семафоры очень похожи на счетные семафоры, но их значения ограничены 0 и 1. В этом типе семафора операция ожидания срабатывает только если semaphore = 1, а операция сигнала завершается успешно, когда semaphore = 0. Реализовать их проще, чем счетные семафоры.
Пример Semaphore
Приведённая ниже программа представляет собой пошаговую реализацию, включающую использование и объявление семафора.
Shared var mutex: semaphore = 1;
Process i
begin
.
.
P(mutex);
execute CS;
V(mutex);
.
.
End;
Подожди и Signal Operaции в Semaphores
Обе эти операции используются для реализации синхронизация процессов. Цель этой операции с семафором — добиться взаимного исключения.
Ждать Operaпроизводство
Этот тип операции семафора помогает контролировать попадание задачи в критическую секцию. Однако если значение ожидания положительное, значение аргумента ожидания X уменьшается. В случае отрицательного или нулевого значения никакая операция не выполняется. Ее также называют операцией P(S).
После уменьшения значения семафора, которое становится отрицательным, команда удерживается до тех пор, пока не будут выполнены необходимые условия.
P(S)
{
while (S<=0);
S--;
}
Signal операция
Этот тип Semaphore Операция используется для управления выходом задачи из критической секции. Она помогает увеличить значение аргумента на 1, что обозначается как V(S).
P(S)
{
while (S>=0);
S++;
}
Подсчет Semaphore против двоичного Semaphore
Вот некоторые основные различия между счетным и двоичным семафором:
| Подсчет Semaphore | Двоичный Semaphore |
| Нет взаимного исключения | Взаимное исключение |
| Любое целочисленное значение | Значение только 0 и 1 |
| Более одного слота | Только один слот |
| Предоставьте набор процессов | Имеет механизм взаимного исключения. |
Разница между Semaphore против Мьютекса
В таблице ниже сравниваются следующие параметры: семафор с мьютексом по нескольким параметрам:
| Параметры | Semaphore | Mutex |
| Механизм | Это тип сигнального механизма. | Это запорный механизм. |
| Тип данных | Semaphore является целочисленной переменной. | Мьютекс — это просто объект. |
| Модификация | Операции ожидания и сигнала могут изменить семафор. | Он изменяется только процессом, который может запросить или освободить ресурс. |
| Управление ресурсами | Если ни один ресурс не свободен, процессу требуется ресурс, который должен выполнить операцию ожидания. Он должен подождать, пока счетчик семафора не станет больше 0. | Если он заблокирован, процесс должен подождать. Процесс должен храниться в очереди. Доступ к нему необходим только тогда, когда мьютекс разблокирован. |
| Нить | Вы можете иметь несколько потоков программы. | Вы можете иметь несколько потоков программы во мьютексе, но не одновременно. |
| Собственность | Значение может быть изменено любым процессом, высвобождающим или получающим ресурс. | Блокировка объекта снимается только тем процессом, который получил его блокировку. |
| Тип | Виды Semaphore являются счетный семафор и двоичный семафор. | Мьютекс не имеет подтипов. |
| Эксплуатация | Semaphore значение изменяется с помощью операций wait() и signal(). | Объект-мьютекс заблокирован или разблокирован. |
| Занятость ресурсов | Он занят, если все ресурсы используются и процесс, запрашивающий ресурс, выполняет операцию wait() и блокируется до тех пор, пока счетчик семафоров не станет >1. | В случае, если объект уже заблокирован, процесс, запрашивающий ресурсы, ожидает и ставится в очередь системы, прежде чем блокировка будет снята. |
Преимущества Semaphores
Вот плюсы/преимущества использования Semaphore:
- Это позволяет нескольким потокам одновременно обращаться к критической секции.
- Semaphores не зависят от машины.
- Semaphores реализованы в машинно-независимом коде микроядра.
- Они не позволяют нескольким процессам войти в критическую секцию.
- Поскольку в семафоре имеется занятое ожидание, никогда не происходит потери времени и ресурсов процесса.
- Они машинно-независимы и должны выполняться в машинно-независимом коде микроядра.
- Они позволяют гибко управлять ресурсами.
Недостатки Semaphores
Вот минусы и недостатки семафора:
- Одним из самых больших ограничений семафора является инверсия приоритета.
- Операционная система должна сохранять track всех вызовов ожидания и сигнального семафора.
- Их использование никогда не является обязательным, но только по соглашению.
- Чтобы избежать взаимоблокировок в семафоре, Wait и Signal Операции необходимо выполнять в правильном порядке.
- Semaphore Программирование — сложная задача, поэтому существует вероятность того, что взаимного исключения не удастся достичь.
- Это также непрактичный метод для крупномасштабного использования, поскольку их использование приводит к потере модульности.
- Semaphore более подвержен ошибкам программиста.
- Это может вызвать тупик или нарушение взаимного исключения из-за ошибки программиста.


