Mutex срещу Semaphore – Разлика между тях
Ключова разлика между Mutex и Semaphore
- Mutex е заключващ механизъм, докато Semaphore е сигнален механизъм
- Mutex е просто обект, докато Semaphore е цяло число
- Mutex няма подтип, докато семафорът има два вида: семафор за броене и двоичен семафор.
- Semaphore поддържа модификация на операциите за изчакване и сигнал, докато Mutex се модифицира само от процеса, който може да поиска или освободи ресурс.
- Semaphore стойността се променя с помощта на операции изчакване () и сигнал (), от друга страна, операциите Mutex се заключват или отключват.

Тук анализирах разликата между Mutex и Semaphore и ще оцени изчерпателно техните плюсове и минуси.
Общи факти за Mutex и Semaphore
Въз основа на моята практика, ето няколко общи факта за Mutex срещу Semaphore:
- Само една задача може да придобие mutex. По този начин mutex има собственост и само собственикът може да го освободи.
- Причините за използването на mutex и семафор са различни, може би поради сходство в тяхното изпълнение, mutex ще се нарича двоичен семафор.
- Едно широко известно погрешно схващане е, че Mutexes и Semaphores са почти еднакви, с единствената разлика, че Mutex може да брои до 1, докато Semaphoreможе да брои от 0 до N.
- Винаги има несигурност между двоичен семафор и мютекс. Може да чуете, че mutex е двоичен семафор, което не е правилно.
Какво е Semaphore?
Семафор е просто променлива, която е неотрицателна и се споделя между нишки. Семафорът е сигнализиращ механизъм и нишка, която чака семафор, може да бъде сигнализирана от друга нишка. Той използва две атомарни операции, 1) изчакване и 2) сигнал за синхронизация на процеса.
A семафор разрешава или забранява достъп до ресурса, което зависи от това как е настроен.
Използване на Semaphore
В случай на единичен буфер, можем да разделим буфера от 4 KB на четири буфера от 1 KB. Semaphore могат да бъдат свързани с тези четири буфера. Това позволява на потребителите и производителите да работят върху различни буфери едновременно.
Предимства на Semaphore
В моята практика ето основните положителни страни от използването на семафор:
- Позволява достъп на повече от една нишка до критичната секция
- Semaphoreса независими от машината.
- Semaphoreса внедрени в машинно-независимия код на микроядрото.
- Те не позволяват множество процеси да влязат в критичната секция.
- Тъй като в semaphore има натоварен график за изчакване, никога няма загуба на време и ресурси за процеса.
- Те са машинно независими, които трябва да се изпълняват в машинно независимия код на микроядрото.
- Те позволяват гъвкаво управление на ресурсите.
Недостатъци на Semaphores
Ето недостатъците на семафора, които срещнах.
- Едно от най-големите ограничения на семафора е инверсията на приоритета.
- Операционната система трябва да следи всички повиквания за изчакване и да сигнализира семафор.
- Използването им никога не се налага, но е само по конвенция.
- За да се избегнат блокирания в семафора, Wait и Signal операциите трябва да се изпълняват в правилния ред.
- Semaphore програмирането е сложен метод, така че има шансове да не се постигне взаимно изключване.
- Това също не е практичен метод за широкомащабно използване, тъй като използването им води до загуба на модулност.
- Semaphore е по-податлив на програмни грешки.
- Може да причини задънена улица или нарушение на взаимното изключване поради грешка на програмиста.
Какво е Mutex?
Пълната форма на Mutex е обект за взаимно изключване. Това е специален тип двоичен семафор, който се използва за контролиране на достъпа до споделения ресурс. Той включва механизъм за наследяване на приоритети, за да се избегнат разширени проблеми с инверсията на приоритета. Позволява текущите задачи с по-висок приоритет да бъдат задържани в блокирано състояние за възможно най-кратко време. Наследяването на приоритет обаче не коригира инверсията на приоритета, а само минимизира нейния ефект.
Използване на Mutex
Мутексът осигурява взаимно изключване, което може да бъде производител или потребител, който може да има ключа (мутекс) и да продължи работата си. Докато производителят запълва буфера, потребителят трябва да изчака и обратно. В Mutex lock през цялото време само една нишка може да работи с целия буфер.
Предимства на Mutex
От това, което наблюдавах, ето основните предимства на Mutex:
- Мутексите са просто прости ключалки, получени преди да влезете в критичната му секция и след това да я освободите.
- Тъй като само една нишка е в своята критична секция във всеки даден момент, няма условия за състезание и данните винаги остават последователни.
Недостатъци на Mutex
В моята практика съм идентифицирал няколко недостатъка на Mutex.
- Ако дадена нишка получи заключване и заспи или бъде изпреварена, тогава другата нишка може да не може да се придвижи напред. Това може да доведе до глад.
- Не може да бъде заключен или отключен от контекст, различен от този, който го е придобил.
- Само една нишка трябва да бъде разрешена в критичната секция наведнъж.
- Нормалната реализация може да доведе до състояние на заето изчакване, което губи време на процесора.
Разлика между Semaphore и Mutex
Въз основа на това, което научих, работейки с тях, ето как Mutexes и Semaphores се различават:
параметри | Semaphore | Мютекс |
---|---|---|
Механизъм | Това е вид сигнален механизъм. | Това е заключващ механизъм. |
Тип данни | Semaphore е цяло число променлива. | Mutex е просто обект. |
Модификация | Операциите за изчакване и сигнализиране могат да променят семафор. | Той се променя само от процеса, който може да поиска или освободи ресурс. |
Управление на ресурси | Ако няма свободен ресурс, тогава процесът изисква ресурс, който трябва да изпълни операция за изчакване. Трябва да изчака, докато броячът на семафора стане по-голям от 0. | Ако е заключен, процесът трябва да изчака. Процесът трябва да се поддържа в опашка. Това трябва да бъде достъпно само когато мютексът е отключен. |
Нишка | Можете да имате множество програмни нишки. | Можете да имате множество програмни нишки в mutex, но не едновременно. |
Собственост | Стойността може да бъде променена от всеки процес, освобождаващ или получаващ ресурса. | Заключването на обекта се освобождава само от процеса, който е получил заключването върху него. |
Видове | Видове Semaphore се броят семафор и двоичен семафор. | Mutex няма подтипове. |
OperaАЦИ | Semaphore стойността се променя с помощта на операция изчакване () и сигнал (). | Mutex обектът е заключен или отключен. |
Заетост на ресурсите | Той е зает, ако всички ресурси се използват и процесът, искащ ресурс, изпълнява операция изчакване () и се блокира, докато броят на семафорите стане >1. | В случай, че обектът вече е заключен, процесът, изискващ ресурси, изчаква и се поставя на опашка от системата, преди заключването да бъде освободено. |
Заключение
Според моя опит ключът към избора между мутекси и семафори е разпознаването на техните оперативни нюанси. Semaphores са идеални за сложни синхронизации, докато mutexes са подходящи за директни взаимни изключения, осигурявайки безопасност на ресурсите в по-прости контексти.