Рубрики

Мьютекс против Семафор

Каковы различия между Mutex против семафора? Когда использовать мьютекс, а когда использовать семафор?

Для проектирования / разработки интеллектуальных приложений требуется конкретное понимание концепций операционной системы. Наша цель — научить читателя этим концепциям и учиться у других экспертов.

Согласно терминологии операционной системы, мьютекс и семафор — это ресурсы ядра, которые предоставляют службы синхронизации (также называемые примитивами синхронизации ). Зачем нам нужны такие примитивы синхронизации? Не будет ли достаточно одного? Чтобы ответить на эти вопросы, нам нужно понять несколько ключевых слов. Пожалуйста, прочитайте посты об атомарности и критическом разделе . Мы проиллюстрируем примерами, чтобы лучше понять эти понятия, а не следовать обычному текстовому описанию ОС.

Проблема производителя-потребителя :

Обратите внимание, что содержание является обобщенным объяснением. Практические детали меняются в зависимости от реализации.

Рассмотрим стандартную проблему производителя-потребителя. Предположим, у нас есть буфер длиной 4096 байт. Поток производителя собирает данные и записывает их в буфер. Поток потребителя обрабатывает собранные данные из буфера. Цель состоит в том, чтобы оба потока не запускались одновременно.

Используя Mutex:

Мьютекс обеспечивает взаимное исключение, и производитель, или потребитель могут иметь ключ (мьютекс) и продолжить свою работу. Пока буфер заполнен производителем, потребитель должен ждать, и наоборот.

В любой момент времени только один поток может работать со всем буфером. Концепция может быть обобщена с использованием семафора.

Используя семафор:

Семафор — это обобщенный мьютекс. Вместо одного буфера мы можем разделить буфер 4 КБ на четыре буфера 1 КБ (идентичные ресурсы). Семафор может быть связан с этими четырьмя буферами. Потребитель и производитель могут работать с разными буферами одновременно.

Заблуждение:

Существует двусмысленность между двоичным семафором и мьютексом . Возможно, мы столкнулись с тем, что мьютекс — это двоичный семафор. Но они не ! Назначение мьютекса и семафора различно. Возможно, из-за сходства в их реализации мьютекс будет называться двоичным семафором.

Строго говоря, мьютекс — это механизм блокировки, используемый для синхронизации доступа к ресурсу. Только одна задача (может быть потоком или процессом, основанным на абстракции ОС) может получить мьютекс. Это означает, что есть владение, связанное с мьютексом, и только владелец может снять блокировку (мьютекс).

Семафор — это сигнальный механизм ( сигнал типа «Я закончил, ты можешь продолжать»). Например, если вы слушаете песни (считаете, что это одна задача) на своем мобильном телефоне, и в то же время ваш друг звонит вам, вызывается прерывание, при котором подпрограмма обработки прерываний (ISR) сигнализирует о пробуждении задачи обработки вызова.

Общие вопросы:

1. Может ли поток получить более одной блокировки (Mutex)?

Да, возможно, что потоку требуется более одного ресурса, следовательно, блокировки. Если какая-либо блокировка недоступна, поток будет ждать (блокировать) блокировку.

2. Может ли мьютекс быть заблокирован более одного раза?

Мьютекс — это замок. С ним связано только одно состояние (заблокировано / разблокировано). Однако рекурсивный мьютекс может быть заблокирован более одного раза (системы жалоб POSIX), в котором с ним связан счет, но при этом сохраняется только одно состояние (заблокировано / разблокировано). Программист должен разблокировать мьютекс столько раз, сколько он был заблокирован.

3. Что происходит, если нерекурсивный мьютекс заблокирован более одного раза.

Тупик. Если поток, который уже заблокировал мьютекс, попытается снова заблокировать мьютекс, он войдет в список ожидания этого мьютекса, что приведет к взаимоблокировке. Это потому, что никакой другой поток не может разблокировать мьютекс. Разработчик операционной системы может проявить осторожность при определении владельца мьютекса и вернуть его, если он уже заблокирован тем же потоком, чтобы предотвратить взаимные блокировки.

4. Являются ли двоичный семафор и мьютекс одинаковыми?

Нет. Мы предлагаем рассматривать их отдельно, так как это объясняется сигнализацией против механизмов блокировки. Но двоичный семафор может испытывать те же критические проблемы (например, инверсию приоритетов), связанные с мьютексом. Мы расскажем об этом в следующей статье.

Программист может предпочесть мьютекс, а не создавать семафор с номером 1.

5. Что такое мьютекс и критический раздел?

Некоторые операционные системы используют один и тот же критический раздел слова в API. Обычно мьютекс является дорогостоящей операцией из-за протоколов защиты, связанных с ним. Наконец, цель мьютекса — атомный доступ. Есть и другие способы достижения атомарного доступа, такие как отключение прерываний, которые могут быть намного быстрее, но разрушают отзывчивость. Альтернативный API использует отключение прерываний.

6. Что такое события?

Семантика мьютекса, семафора, события, критической секции и т. Д. Одинакова. Все это примитивы синхронизации. По стоимости их использования они различаются. Мы должны проконсультироваться с документацией ОС для точных деталей

7. Можем ли мы получить мьютекс / семафор в программе обработки прерываний?

ISR будет работать асинхронно в контексте текущего запущенного потока. Не рекомендуется запрашивать (блокировать вызов) доступность примитивов синхронизации в ISR. ISR должны быть короткими, вызов мьютекса / семафора может заблокировать текущий работающий поток. Тем не менее, ISR может сигнализировать семафор или разблокировать мьютекс.

8. Что мы подразумеваем под «блокировкой потоков на мьютексах / семафорах», когда они недоступны?

С каждым примитивом синхронизации связан список ожидания. Когда ресурс недоступен, запрашивающий поток будет перемещен из рабочего списка процессора в список ожидания примитива синхронизации. Когда ресурс доступен, поток с более высоким приоритетом в списке ожидания получает ресурс (точнее, это зависит от политик планирования).

Рекомендуемые посты:

Мьютекс против Семафор

0.00 (0%) 0 votes