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