Управление целостностью совместно используемой информации в значительной степени зависит от синхронизации процессов. Для решения проблем критических секций доступны как программные, так и аппаратные решения.
С другой стороны, аппаратные решения проблемы критической секции чрезвычайно сложны в реализации. Давайте рассмотрим и сравним Mutex и Semaphore, два прикладных решения для решения проблем критических секций.
Основные выводы
- Мьютекс обеспечивает взаимное исключение, позволяя одновременно только одному потоку обращаться к общему ресурсу.
- Семафор контролирует доступ к ресурсу, управляя фиксированным количеством разрешений, позволяя нескольким потокам одновременно обращаться к ресурсу.
- Мьютексы проще в использовании, а семафоры обеспечивают большую гибкость в управлении доступом к общим ресурсам.
Мьютекс против семафора
Мьютекс (сокращение от взаимного исключения) — это тип блокировки, который используется для обеспечения того, чтобы только один поток или процесс мог получить доступ к общему ресурсу в каждый момент времени. Семафор — это механизм, который управляет доступом к общим ресурсам через счетчик, контролирующий доступ, с разными значениями, представляющими разные состояния ресурса.
Мьютекс означает объект взаимного исключения. Это тип двоичного семафора, который используется для ограничения доступа к общему ресурсу. Чтобы предотвратить длительную инверсию приоритетов, он имеет механизм наследования приоритетов.
Это позволяет блокировать существующие задания с более высоким приоритетом на минимально возможное время. С другой стороны, наследование приоритета не исправляет инверсию приоритета; скорее, это уменьшает его влияние.
Семафор — это неотрицательная переменная, которая поддерживается между потоками. Семафор — это сигнальный механизм, и другой поток может сигнализировать потоку, ожидающему семафор.
Для синхронизации процессов используются две атомарные процедуры: () wait и () signal. В зависимости от того, как он настроен, семафор либо разрешает, либо запрещает доступ к ресурсу.
Сравнительная таблица
Параметры сравнения | Mutex | семафор |
---|---|---|
Механизм | Это запирающая система. | Это какая-то сигнальная система. |
Цель | Поток представлен мьютексом. | Процессы представлены семафором. |
Природа | Мьютекс является атомарным и сингулярным. | Семафор является атомарным по своей природе, но не единичным. |
Тип данных | Mutex — это не более чем часть программного обеспечения. | Семафор — это переменная с целочисленным значением. |
Тип | Mutex не имеет подтипов. | Счетные и двоичные семафоры — это два типа семафоров. |
Модификация | Только процесс, который может запросить или освободить ресурс, может изменить его. | Семафор можно изменить с помощью функций ожидания и сигнала. |
Что такое Мьютекс?
Взаимное исключение — это термин, используемый для описания ситуации. Мьютекс — это краткое название объекта. Из слова взаимное исключение мы можем сделать вывод, что только одна программа в данный момент имеет доступ к определенному ресурсу.
Объект мьютекса позволяет многим потокам приложения обращаться к одному и тому же ресурсу одновременно, только по одному за раз.
Всякий раз, когда программа запрашивает у системы ресурс, система создает объект мьютекса с уникальным идентификатором или идентификатором. В результате каждый раз, когда программа хочет использовать этот ресурс, она блокирует объект.
Затем программа использует ресурс, прежде чем окончательно освободить объект мьютекса. Затем объект мьютекса может быть создан и использован другими программами таким же образом.
Блокируя объект, этот конкретный ресурс назначается этому конкретному процессу, и никакой другой процесс не может его использовать. В результате никаким другим программам не разрешается использовать системные ресурсы в критической области. Таким образом, объект мьютекса можно использовать для выполнения синхронизации процесса.
Мьютекс допускает взаимное исключение, поскольку производитель или потребитель могут иметь ключ (мьютекс) и продолжать работу. Потребитель должен ждать, пока буфер производителя заполнится, и наоборот.
Что такое семафор?
Семафор — это целочисленная переменная S, которая используется для синхронизации процессов и инициализируется количеством ресурсов в системе. Чтобы изменить значение S, он использует две основные функции: wait() и signal().
Обе эти функции используются для изменения значения семафора, но они позволяют делать это только одной программе за раз, поэтому никакие два метода не могут изменить значение семафора одновременно. Счетные семафоры и двоичные семафоры — это два типа семафоров.
Переменная семафора сначала инициализируется количеством доступных ресурсов при подсчете семафоров. Затем метод wait() выполняется каждый раз, когда процессу требуется ресурс, а значение переменной semaphore уменьшается на единицу.
Затем процесс использует ресурс, после чего вызывает метод signal(), который увеличивает значение переменной семафора на единицу. Всякий раз, когда значение переменной semaphore достигает 0, то есть когда программа израсходовала все ресурсы, и больше не осталось ни одного для использования,
Затем, если другому процессу потребуется использовать ресурсы, ему придется ждать своего времени. Таким образом мы устанавливаем синхронизацию процессов.
В двоичных семафорах значение переменной семафора равно 0 или 1. Когда процесс хочет использовать ресурс, вызывается метод wait(), и значение семафора изменяется на 0 с 1.
Затем процесс использует ресурс, и после этого вызывается метод signal(), и значение переменной semaphore устанавливается равным 1.
Если значение переменной семафора равно 0 в данный момент времени, и другая программа хочет получить доступ к тому же ресурсу, она должна ждать, пока предыдущая программа освободит ресурсы. Синхронизация процесса может быть выполнена таким образом. Это сравнимо с мьютексом, но ничего не блокирует.
Основные различия между мьютексом и семафором
- Mutex использует механизм блокировки, что означает, что если процессу необходимо использовать ресурс, он должен сначала заблокировать его, использовать, а затем освободить. Semaphore, с другой стороны, использует метод сигнализации, в котором функции wait() и signal() используются для указания того, отдает ли процесс ресурс или потребляет его.
- Мьютекс — это объект, тогда как семафор — это переменная с целочисленным значением.
- Объект мьютекса требует, чтобы различные потоки процесса одновременно подключались к одному и тому же совместно используемому ресурсу. Семафор, с другой стороны, позволяет нескольким потокам процесса обращаться к конечному экземпляру ресурса до тех пор, пока он не станет доступным.
- В мьютексе блокировка может быть получена и снята одним и тем же процессом в одно и то же время. Однако значение переменной семафора может быть изменено любым процессом, которому требуется ресурс, но только один процесс может изменить значение за раз.
- Мьютекс позволяет различным программным потокам получать доступ к одному и тому же общему ресурсу, но только по одному за раз, тогда как, с другой стороны, семафор требует, чтобы различные программные потоки одновременно подключали ограниченное количество ресурсов.