Що таке Semaphore? Підрахунок, двійкові типи з прикладом
⚡ Розумний підсумок
Semaphore В операційній системі — це невід'ємна цілочисельна змінна, що використовується спільно між потоками та координує доступ до спільних ресурсів за допомогою двох атомарних операцій, wait та signal, запобігаючи умовам гонки під час синхронізації процесів.

Що таке Semaphore?
Semaphore це просто змінна, яка є невід’ємною та використовується між потоками. Семафор — це механізм сигналізації, і потік, який очікує на семафор, може бути сигналізований іншим потоком. Він використовує дві атомарні операції: 1) очікування та 2) Signal для синхронізації процесу.
Семафор дозволяє або забороняє доступ до ресурсу, залежно від того, як він налаштований.
Характеристика Semaphore
Ось характеристики семафора:
- Це механізм, який можна використовувати для забезпечення синхронізації завдань.
- Це низькорівневий механізм синхронізації.
- Semaphore завжди матиме невід’ємне ціле значення.
- Semaphore можна реалізувати за допомогою тестових операцій і переривань, які повинні виконуватися за допомогою файлових дескрипторів.
Види Semaphores
Два поширені типи семафорів:
- Підрахунок семафорів
- Бінарні семафори
Підрахунок Semaphores
Цей тип Semaphore використовує підрахунок, який допомагає завданню бути отриманим або випущеним кілька разів. Якщо початковий підрахунок дорівнює 0, семафор підрахунку слід створювати у недоступному стані.
Однак, якщо лічильник > 0, семафор створюється в доступному стані, і кількість токенів, які він має, дорівнює його лічильнику.
двійковий Semaphores
Бінарні семафори досить схожі на семафори підрахунку, але їх значення обмежене 0 та 1. У цьому типі семафора операція очікування працює лише тоді, коли семафор = 1, а операція сигналу виконується успішно, коли семафор = 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 проти Mutex
У таблиці нижче порівнюється семафор з м'ютексом за кількома параметрами:
| Параметри | Semaphore | Mutex |
| Механізм | Це різновид сигнального механізму. | Це запірний механізм. |
| Тип даних | Semaphore є цілочисельною змінною. | Mutex - це просто об'єкт. |
| Модифікація | Операції очікування та сигналу можуть змінити семафор. | Його змінює лише процес, який може запитувати або звільняти ресурс. |
| Управління ресурсами | Якщо немає вільного ресурсу, тоді для процесу потрібен ресурс, який має виконати операцію очікування. Потрібно почекати, поки кількість семафора не перевищить 0. | Якщо він заблокований, процес має почекати. Процес має відбуватися в черзі. Доступ до нього потрібен лише тоді, коли м’ютекс розблоковано. |
| Нитка | Ви можете мати кілька програмних потоків. | Ви можете мати кілька програмних потоків у mutex, але не одночасно. |
| Власність | Значення може бути змінено будь-яким процесом звільнення або отримання ресурсу. | Блокування об'єкта знімається тільки тим процесом, який його заблокував. |
| типи | Види Semaphore підраховуються семафор і двійковий семафор. | Mutex не має підтипів. |
| Operaції | Semaphore значення змінюється за допомогою операцій очікування () і сигналу (). | Об’єкт Mutex заблоковано або розблоковано. |
| Зайнятість ресурсів | Він зайнятий, якщо всі ресурси використовуються, а процес, який запитує ресурс, виконує операцію wait () і блокується, доки кількість семафорів не стане >1. | У випадку, якщо об’єкт уже заблоковано, процес, який запитує ресурси, очікує і ставиться в чергу системою до зняття блокування. |
Переваги Semaphores
Ось плюси/переваги використання Semaphore:
- Це дозволяє кільком потокам отримувати доступ до критичної секції.
- Semaphores незалежні від машини.
- Semaphores реалізовані в машинно-незалежному коді мікроядра.
- Вони не дозволяють декільком процесам входити в критичну секцію.
- Оскільки в семафорі є зайняте очікування, час і ресурси процесу ніколи не витрачаються.
- Вони є машинно-незалежними, які повинні виконуватися в машинно-незалежному коді мікроядра.
- Вони дозволяють гнучко управляти ресурсами.
Недоліки Semaphores
Ось недоліки/мінуси семафора:
- Одним із найбільших обмежень семафора є інверсія пріоритету.
- Операційна система повинна підтримувати track усіх викликів семафорів очікування та сигналізації.
- Їхнє використання ніколи не є примусовим, але лише за конвенцією.
- Щоб уникнути взаємоблокувань у семафорі, Wait і Signal операції повинні виконуватися в правильному порядку.
- Semaphore Програмування складне, тому існує ймовірність того, що взаємовиключення не буде досягнуто.
- Це також не практичний метод для широкомасштабного використання, оскільки їх використання призводить до втрати модульності.
- Semaphore більш схильний до помилок програміста.
- Це може викликати тупик або порушення взаємного виключення через помилку програміста.


