Что такое Семафор? Подсчет, двоичные типы с примером

Что такое семафор?

семафор — это просто переменная, которая неотрицательна и распределяется между потоками. Семафор — это сигнальный механизм, и поток, ожидающий семафора, может получить сигнал от другого потока. Он использует два atomic операции, 1) Ожидание и 2) Сигнал для синхронизации процесса.

Семафор либо разрешает, либо запрещает доступ к ресурсу, в зависимости от того, как он настроен.

Характеристика семафора

Вот характеристики семафора:

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

Типы семафоров

Два распространенных типа семафоров:

  • Подсчет семафоров
  • Бинарные семафоры.

Подсчет семафоров

Этот тип семафора использует счетчик, который помогает задаче получать или освобождать множество раз. Если начальный счетчик = 0, счетный семафор должен быть создан в недоступном состоянии.

Подсчет семафоров
Подсчет семафоров

Однако если счетчик > 0, семафор создается в доступном состоянии, и количество имеющихся у него токенов равно его счетчику.

Двоичные семафоры

Бинарные семафоры очень похожи на счетные семафоры, но их значения ограничены 0 и 1. В этом типе семафоров операция ожидания работает только в том случае, если семафор = 1, а операция сигнала завершается успешно, когда семафор = 0. Это легко реализовать, чем подсчет семафоров.

Двоичные семафоры

Двоичные семафоры

Пример семафора

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

Shared var mutex: semaphore = 1;
Process i
    begin
    .
    .
    P(mutex);
    execute CS;
    V(mutex);
    .
    .
    End;

Ожидание и сигнальные операции в семафорах

Обе эти операции используются для реализации синхронизация процессов. Цель этой операции с семафором — добиться взаимного исключения.

Подождите операции

Этот тип операции семафора помогает контролировать попадание задачи в критическую секцию. Однако если значение ожидания положительное, значение аргумента ожидания X уменьшается. В случае отрицательного или нулевого значения никакая операция не выполняется. Ее также называют операцией P(S).

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

Copy CodeP(S)
{ 
    while (S<=0);
    S--;
}

Сигнальная операция

Этот тип операции Семафора используется для контроля выхода задачи из критической секции. Это помогает увеличить значение аргумента на 1, что обозначается как V(S).

Copy CodeP(S)
{ 
    while (S>=0);
    S++;
}

Счетный семафор против двоичного семафора

Вот некоторые основные различия между счетным и двоичным семафором:

Подсчет семафоров Двоичный семафор
Нет взаимного исключения Взаимное исключение
Любое целочисленное значение Значение только 0 и 1
Более одного слота Только один слот
Предоставьте набор процессов Имеет механизм взаимного исключения.

Разница между семафором и мьютексом

параметры семафор Mutex
Механизм Это тип сигнального механизма. Это запорный механизм.
Тип данных Семафор — целочисленная переменная. Мьютекс — это просто объект.
Модификация Операции ожидания и сигнала могут изменить семафор. Он изменяется только процессом, который может запросить или освободить ресурс.
Управление ресурсами Если ни один ресурс не свободен, процессу требуется ресурс, который должен выполнить операцию ожидания. Он должен подождать, пока счетчик семафора не станет больше 0. Если он заблокирован, процесс должен подождать. Процесс должен храниться в очереди. Доступ к нему необходим только тогда, когда мьютекс разблокирован.
Нить Вы можете иметь несколько потоков программы. Вы можете иметь несколько потоков программы во мьютексе, но не одновременно.neoусли.
Собственность Значение может быть изменено любым процессом, высвобождающим или получающим ресурс. Блокировка объекта снимается только тем процессом, который получил его блокировку.
Тип Типы семафоров: счетный семафор, двоичный семафор и Мьютекс не имеет подтипов.
Эксплуатация Значение семафора изменяется с помощью операций ожидания () и сигнала (). Объект-мьютекс заблокирован или разблокирован.
Занятость ресурсов Он занят, если все ресурсы используются и процесс, запрашивающий ресурс, выполняет операцию wait() и блокируется до тех пор, пока счетчик семафоров не станет >1. В случае, если объект уже заблокирован, процесс, запрашивающий ресурсы, ожидает и ставится в очередь системы, прежде чем блокировка будет снята.

Преимущества семафоров

Вот плюсы/преимущества использования семафора:

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

Недостаток семафоров

Вот минусы/недостаток семафора

  • Одним из самых больших ограничений семафора является инверсия приоритета.
  • Операционная система должна отслеживать все вызовы ожидания и сигнализировать семафор.
  • Их использование никогда не является обязательным, но только по соглашению.
  • Во избежание деadlocks в семафоре, операции ожидания и сигнала должны выполняться в правильном порядке.
  • Программирование семафоров является сложным, поэтому есть вероятность не добиться взаимного исключения.
  • Это также непрактичный метод для крупномасштабного использования, поскольку их использование приводит к потере модульности.
  • Семафор более подвержен ошибкам программиста.
  • Это может вызвать deadlock или нарушение взаимного исключения из-за ошибки программиста.

Итоги

  • Семафор определяется как неотрицательная переменная, разделяемая между потоками.
  • Это механизм, который можно использовать для синхронизации задач.
  • Счетный семафор использует счетчик, который помогает задаче быть полученной или освобожденной несколько раз.
  • Бинарные семафоры очень похожи на счетные семафоры, но их значение ограничено 0 и 1.
  • Операция ожидания помогает контролировать попадание задачи в критическую секцию.
  • Работа сигнального семафора используется для контроля выхода задачи из критического участка.
  • Счетный семафор не имеет взаимного исключения, тогда как двоичный семафор имеет взаимное исключение.
  • Семафор означает механизм сигнализации, тогда как Мьютекс — это механизм блокировки.
  • Семафор позволяет нескольким потокам получить доступ к критической секции.
  • Одним из самых больших ограничений семафора является инверсия приоритета.