Според терминологията на операционната система, mutex и семафорите са ресурси на ядрото, които предоставят услуги за синхронизация, наричани още примитиви за синхронизация . Синхронизирането на процесите играе важна роля за поддържане на съгласуваността на споделените данни. Налични са както софтуерните, така и хардуерните решения за справяне с проблеми с критични секции. Но хардуерните решения за проблеми с критични секции са доста трудни за прилагане. Mutex и semaphore предоставят услуги за синхронизация, но не са едно и също.
Какво е Mutex?
Mutex е обект за взаимно изключване, който синхронизира достъпа до ресурс. Създава се с уникално име в началото на програмата. Механизмът за заключване на mutex гарантира, че само една нишка може да придобие mutex и да влезе в критичната секция. Тази нишка освобождава мютекса само когато излезе в критичната секция.
Това е специален тип двоичен семафор, използван за контролиране на достъпа до споделения ресурс. Той включва механизъм за наследяване на приоритети, за да се избегнат разширени проблеми с инверсията на приоритета. Позволява текущите задачи с по-висок приоритет да бъдат задържани в блокирано състояние за възможно най-кратко време. Наследяването на приоритета обаче не коригира инверсията на приоритета, а само минимизира нейния ефект.
Пример
Това е показано с помощта на следния пример,
wait (mutex); ..... Critical Section ..... signal (mutex);
Използване на Mutex
Мутексът осигурява взаимно изключване, или производител, или потребител, който може да има ключа (мутекс) и да продължи работата си. Докато производителят запълни буфера, потребителят трябва да изчака и обратно. В Mutex lock през цялото време само една нишка може да работи с целия буфер.
Когато програмата стартира, тя изисква от системата да създаде mutex обект за даден ресурс. Системата създава mutex обект с уникално име или ID. Всеки път, когато програмната нишка иска да използва ресурса, тя заема заключване на mutex обект, използва ресурса и след използване освобождава заключването на mutex обект. След това се разрешава на следващия процес да придобие ключалката на mutex обекта.
Междувременно процес е придобил заключването на обекта mutex и никоя друга нишка или процес няма достъп до този ресурс. Ако обектът mutex вече е заключен, процесът, желаещ да получи заключването на обекта mutex, трябва да изчака и се поставя на опашка от системата, докато обектът mutex бъде отключен.
Предимства на Mutex
Ето следните предимства на mutex, като например:
- Mutex са просто прости ключалки, получени преди влизане в неговата критична секция и след това освобождаването й.
- Тъй като само една нишка е в своята критична секция във всеки даден момент, няма условия за състезание и данните винаги остават последователни.
Недостатъци на Mutex
Mutex има и някои недостатъци, като например:
- Ако дадена нишка получи заключване и заспи или бъде изпреварена, тогава другата нишка може да не се придвижи напред. Това може да доведе до глад.
- Не може да бъде заключен или отключен от контекст, различен от този, който го е придобил.
- Само една нишка трябва да бъде разрешена в критичната секция наведнъж.
- Нормалното внедряване може да доведе до състояние на заето изчакване, което губи време на процесора.
Какво е семафор?
Семафорът е просто променлива, която е неотрицателна и се споделя между нишки. Семафорът е сигнализиращ механизъм и друга нишка може да сигнализира за нишка, която чака семафор.
Семафорът използва две атомни операции,
1. Изчакайте: Операцията за изчакване намалява стойността на своя аргумент S, ако е положителен. Ако S е отрицателно или нула, тогава не се извършва операция.
wait(S) { while (S<=0); s--; } < pre> <p> <strong>2. Signal for the process synchronization:</strong> The signal operation increments the value of its argument S.</p> <pre> signal(S) { S++; } </pre> <p>A semaphore either allows or reject access to the resource, depending on how it is set up.</p> <h3>Use of Semaphore</h3> <p>In the case of a single buffer, we can separate the 4 KB buffer into four buffers of 1 KB. Semaphore can be associated with these four buffers, allowing users and producers to work on different buffers simultaneously.</p> <h3>Types of Semaphore</h3> <p>Semaphore is distinguished by the operating system in two categories <strong>Counting semaphore</strong> and <strong>Binary semaphore</strong> .</p> <p> <strong>1. Counting Semaphore:</strong> The semaphore S value is initialized to the <strong>number of resources</strong> present in the system. Whenever a process wants to access the resource, it performs <strong>the wait()</strong> operation on the semaphore and <strong>decrements</strong> the semaphore value by one. When it releases the resource, it performs <strong>the signal()</strong> operation on the semaphore and <strong>increments</strong> the semaphore value by one.</p> <p>When the semaphore count goes to 0, it means the processes occupy all resources. A process needs to use a resource when the semaphore count is 0. It executes the <strong>wait()</strong> operation and gets <strong>blocked</strong> until the semaphore value becomes greater than 0.</p> <img src="//techcodeview.com/img/operating-system/67/mutex-vs-semaphore-3.webp" alt="Mutex vs Semaphore"> <p> <strong>2. Binary semaphore:</strong> The value of a semaphore ranges between <strong>0</strong> and <strong>1</strong> . It is similar to mutex lock, but mutex is a locking mechanism, whereas the semaphore is a signaling mechanism. In binary semaphore, if a process wants to access the resource, it performs <strong>the wait()</strong> operation on the semaphore and decrements the value of the semaphore from 1 to 0. When it releases the resource, it performs a <strong>signal</strong> <strong>()</strong> operation on the semaphore and increments its value to 1. Suppose the value of the semaphore is 0 and a process wants to access the resource. In that case, it performs <strong>wait()</strong> operation and block itself till the current process utilizing the resources releases the resource.</p> <img src="//techcodeview.com/img/operating-system/67/mutex-vs-semaphore-4.webp" alt="Mutex vs Semaphore"> <h3>Advantages of Semaphore</h3> <p>Here are the following advantages of semaphore, such as:</p> <ul> <li>It allows more than one thread to access the critical section.</li> <li>Semaphores are machine-independent.</li> <li>Semaphores are implemented in the machine-independent code of the microkernel.</li> <li>They do not allow multiple processes to enter the critical section.</li> <li>As there is busy and waiting in semaphore, there is never wastage of process time and resources.</li> <li>They are machine-independent, which should be run in the machine-independent code of the microkernel.</li> <li>They allow flexible management of resources.</li> </ul> <h3>Disadvantage of Semaphores</h3> <p>Semaphores also have some disadvantages, such as:</p> <ul> <li>One of the biggest limitations of a semaphore is priority inversion.</li> <li>The operating system has to keep track of all calls to wait and signal semaphore.</li> <li>Their use is never enforced, but it is by convention only.</li> <li>The Wait and Signal operations require to be executed in the correct order to avoid deadlocks in semaphore.</li> <li>Semaphore programming is a complex method, so there are chances of not achieving mutual exclusion.</li> <li>It is also not a practical method for large scale use as their use leads to loss of modularity.</li> <li>Semaphore is more prone to programmer error</li> <li>, and it may cause deadlock or violation of mutual exclusion due to programmer error.</li> </ul> <h3>Difference between Mutex and Semaphore</h3> <p>The basic difference between semaphore and mutex is that semaphore is a signalling mechanism, i.e. processes perform wait() and signal() operation to indicate whether they are acquiring or releasing the resource. In contrast, a mutex is a locking mechanism, and the process has to acquire the lock on a mutex object if it wants to acquire the resource. Here are some more differences between semaphore and mutex, such as:</p> <img src="//techcodeview.com/img/operating-system/67/mutex-vs-semaphore-5.webp" alt="Mutex vs Semaphore"> <br> <table class="table"> <tr> <th>Terms</th> <th>Mutex</th> <th>Semaphore</th> </tr> <tr> <td>Definition</td> <td>The mutex is a locking mechanism, as to acquire a resource, a process needs to lock the mutex object, and while releasing a resource process has to unlock the mutex object.</td> <td>Semaphore is a signalling mechanism as wait() and signal() operations performed on the semaphore variable indicate whether a process is acquiring or releasing the resource.</td> </tr> <tr> <td>Existence</td> <td>A mutex is an object.</td> <td>Semaphore is an integer variable.</td> </tr> <tr> <td>Function</td> <td>Mutex allows multiple program threads to access a single resource but not simultaneously.</td> <td>Semaphore allows multiple program threads to access a finite instance of resources.</td> </tr> <tr> <td>Ownership</td> <td>Mutex object lock is released only by the process that has acquired the lock on the mutex object.</td> <td>Semaphore value can be changed by any process acquiring or releasing the resource by performing wait() and signal() operation.</td> </tr> <tr> <td>Categorize</td> <td>Mutex is not categorized further.</td> <td>The semaphore can be categorized into counting semaphore and binary semaphore.</td> </tr> <tr> <td>Operation</td> <td>The mutex object is locked or unlocked by the process of requesting or releasing the resource.</td> <td>Semaphore value is modified using wait() and signal() operation apart from initialization.</td> </tr> <tr> <td>Resources Occupied</td> <td>If a mutex object is already locked, then the process desiring to acquire resource waits and get queued by the system till the resource is released and the mutex object gets unlocked.</td> <td>Suppose the process acquires all the resources, and no resource is free. In that case, the process desiring to acquire resource performs wait() operation on semaphore variable and blocks itself till the count of semaphore become greater than 0.</td> </tr> </table> <hr></=0);>
Семафорът позволява или отхвърля достъп до ресурса в зависимост от това как е настроен.
Използване на семафор
В случай на единичен буфер, можем да разделим буфера от 4 KB на четири буфера от 1 KB. Семафорът може да бъде свързан с тези четири буфера, което позволява на потребителите и производителите да работят върху различни буфери едновременно.
Видове семафори
Семафор се отличава от операционната система в две категории Семафор за броене и Двоичен семафор .
1. Семафор за броене: Стойността на семафор S се инициализира към брой ресурси присъства в системата. Всеки път, когато процес иска достъп до ресурса, той изпълнява чакането() операция на семафора и намалява стойността на семафора с единица. Когато освободи ресурса, той изпълнява сигналът() операция на семафора и нараствания стойността на семафора с единица.
Когато броят на семафорите достигне 0, това означава, че процесите заемат всички ресурси. Един процес трябва да използва ресурс, когато броят на семафорите е 0. Той изпълнява изчакайте() операция и получава блокиран докато стойността на семафора стане по-голяма от 0.
2. Двоичен семафор: Стойността на семафор варира между 0 и 1 . Подобно е на заключването на mutex, но mutex е заключващ механизъм, докато семафорът е сигнализиращ механизъм. В двоичния семафор, ако даден процес иска достъп до ресурса, той изпълнява чакането() операция върху семафора и намалява стойността на семафора от 1 на 0. Когато освободи ресурса, той извършва сигнал () операция върху семафора и увеличава стойността му до 1. Да предположим, че стойността на семафора е 0 и процес иска достъп до ресурса. В такъв случай се изпълнява изчакайте() операция и се блокира, докато текущият процес, използващ ресурсите, освободи ресурса.
Предимства на Semaphore
Ето следните предимства на семафора, като например:
- Позволява достъп на повече от една нишка до критичната секция.
- Семафорите са независими от машината.
- Семафорите са внедрени в машинно-независимия код на микроядрото.
- Те не позволяват множество процеси да влязат в критичната секция.
- Тъй като в семафора има заетост и чакане, никога няма загуба на време и ресурси за процеса.
- Те са машинно независими, които трябва да се изпълняват в машинно независимия код на микроядрото.
- Те позволяват гъвкаво управление на ресурсите.
Недостатък на семафорите
Семафорите също имат някои недостатъци, като например:
- Едно от най-големите ограничения на семафора е инверсията на приоритета.
- Операционната система трябва да следи всички повиквания за изчакване и да сигнализира семафор.
- Използването им никога не се налага, но е само по конвенция.
- Операциите Wait и Signal изискват да се изпълняват в правилния ред, за да се избегнат блокирания в семафора.
- Семафорното програмиране е сложен метод, така че има шансове да не се постигне взаимно изключване.
- Това също не е практичен метод за широкомащабно използване, тъй като използването им води до загуба на модулност.
- Семафорът е по-склонен към програмни грешки
- , и това може да причини блокиране или нарушаване на взаимното изключване поради грешка на програмиста.
Разлика между Mutex и Semaphore
Основната разлика между семафора и mutex е, че семафорът е сигнализиращ механизъм, т.е. процесите изпълняват операция wait() и signal(), за да покажат дали придобиват или освобождават ресурса. За разлика от това, mutex е заключващ механизъм и процесът трябва да получи заключването на mutex обект, ако иска да придобие ресурса. Ето още няколко разлики между семафор и мютекс, като например:
Условия | Mutex | Семафор |
---|---|---|
Определение | Мутексът е механизъм за заключване, тъй като за да придобие ресурс, процесът трябва да заключи обекта на мутекса и докато освобождава ресурс, процесът трябва да отключи обекта на мутекса. | Семафорът е механизъм за сигнализиране, тъй като операциите wait() и signal(), изпълнявани върху променливата на семафора, показват дали даден процес придобива или освобождава ресурса. |
Съществуване | Мутексът е обект. | Семафорът е целочислена променлива. |
функция | Mutex позволява на множество програмни нишки да имат достъп до един ресурс, но не едновременно. | Семафорът позволява на множество програмни нишки да имат достъп до ограничен екземпляр от ресурси. |
Собственост | Заключването на Mutex обект се освобождава само от процеса, който е придобил заключването на обекта Mutex. | Стойността на семафора може да бъде променена от всеки процес, който придобива или освобождава ресурса чрез изпълнение на операция wait() и signal(). |
Категоризирайте | Mutex не се категоризира допълнително. | Семафорът може да бъде категоризиран като семафор за броене и двоичен семафор. |
Операция | Обектът mutex се заключва или отключва от процеса на заявяване или освобождаване на ресурса. | Стойността на семафора се променя с помощта на операция wait() и signal() освен инициализацията. |
Заети ресурси | Ако мютекс обект вече е заключен, тогава процесът, желаещ да придобие ресурс, чака и се поставя на опашка от системата, докато ресурсът бъде освободен и мютекс обектът се отключи. | Да предположим, че процесът придобива всички ресурси и няма свободен ресурс. В този случай процесът, желаещ да придобие ресурс, изпълнява операция wait() върху семафорната променлива и се блокира, докато броят на семафорите стане по-голям от 0. |
=0);>