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

Что такое Semaphore?

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

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

Характеристика Semaphore

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

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

Виды Semaphores

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

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

Подсчет Semaphores

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

Подсчет Semaphores
Подсчет Semaphores

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

Двоичный Semaphores

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

Двоичный Semaphores

Двоичный Semaphores

Пример Semaphore

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

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

Подожди и Signal Operaции в Semaphores

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

Ждать Operaпроизводство

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

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

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

Signal операция

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

Copy CodeP(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 реализованы в машинно-независимом коде микроядра.
  • Они не позволяют нескольким процессам войти в критическую секцию.
  • Поскольку в семафоре имеется занятое ожидание, никогда не происходит потери времени и ресурсов процесса.
  • Они машинно-независимы и должны выполняться в машинно-независимом коде микроядра.
  • Они позволяют гибко управлять ресурсами.

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

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

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

Резюме

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