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