operating system - пример - Разница между двоичным семафором и мьютексом




semaphore c++ пример (20)

Mutex используется для защиты конфиденциального кода и данных, семафор используется для синхронизации. Вы также можете практично использовать защиту защищенного кода, но может возникнуть риск, что защита от другого потока будет осуществляться с помощью V.So. разница между би-семафором и мьютексом - это собственность. Например, в туалете, Mutex подобен тому, что можно войти в туалет и запереть дверь, никто другой не может войти, пока мужчина не выйдет, би-семафор подобен тому, что можно ввести туалет и запереть дверь, но кто-то другой может войти, попросив администратора открыть дверь, это смешно.

Есть ли разница между двоичным семафором и мьютексом или они по существу одинаковы?


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

В Windows двоичные семафоры больше похожи на объекты событий, чем на мьютексы.


В Windows существует два отличия между мьютексами и двоичными семафорами:

  1. Мьютекс может быть выпущен только потоком, который имеет право собственности, то есть поток, который ранее назывался функцией Wait (или который владел при создании). Семафор может быть выпущен любым потоком.

  2. Поток может многократно вызывать функцию ожидания на мьютексе без блокировки. Однако, если вы дважды вызываете функцию ожидания в двоичном семафоре, не отпуская семафор между ними, поток будет блокироваться.


В окнах разница следующая. MUTEX: процесс, который успешно выполняет wait, должен выполнить сигнал и наоборот. БИНАРНЫЕ СЕМАФОРЫ: Различные процессы могут выполнять операцию ожидания или сигнала на семафоре.


Измененный вопрос: в чем разница между мьютексом и «двоичным» семафором в «Linux»?

Ans: Ниже приведены различия - i) Scope - объем мьютекса находится в пространстве адресов процесса, которое его создало и используется для синхронизации потоков. В то время как семафор может использоваться в пространстве процессов и, следовательно, может использоваться для межпроцессной синхронизации.

ii) Мьютекс легкий и быстрый, чем семафор. Futex еще быстрее.

iii) Mutex может быть получен одним и тем же потоком успешно несколько раз с условием, что он должен выпускать его столько же раз. Другой поток, пытающийся приобрести, блокирует. Если в случае семафора, если тот же процесс пытается его снова получить, он блокируется, поскольку его можно получить только один раз.


Их семантика синхронизации очень различна:

  • мьютексы позволяют сериализовать доступ к данному ресурсу, т. е. несколько потоков ожидают блокировки, по одному за раз и, как сказано ранее, поток владеет блокировкой до тех пор, пока она не будет выполнена: только этот конкретный поток может разблокировать его.
  • двоичный семафор - это счетчик со значением 0 и 1: задача блокирует его, пока какая-либо задача не выполняет sem_post. Семафор рекламирует доступность ресурса и обеспечивает механизм ожидания, пока он не будет объявлен как доступный.

Как таковой, можно видеть мьютекс как токен, передаваемый от задачи к задачам, и семафор в качестве светофора (он сигнализирует кому-то, что он может продолжить).


Миф:

Пара статей гласит, что «двоичный семафор и мьютексы такие же» или «Семафор со значением 1 - это мьютекс», но основное отличие заключается в том, что Mutex может быть выпущен только потоком, который его приобрел, тогда как вы можете сигнализировать семафор из любого другого потока

Ключевые моменты:

• Нить может приобретать более одного замка (Mutex).

• Мьютекс можно заблокировать более одного раза, только если его рекурсивный мьютекс, здесь блокировка и разблокировка для мьютекса должна быть одинаковой

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

• Двоичный семафор и мьютекс похожи, но не одинаковы.

• Mutex является дорогостоящей операцией из-за связанных с ним протоколов защиты.

• Основная цель мьютекса - добиться доступа атома или блокировки ресурса


Мьютекс используется для «Блокирующих механизмов». один процесс за раз может использовать общий ресурс

в то время как

Семафоры используются для «Сигнализационных механизмов», таких как «Я сделан, теперь можно продолжать»


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

Практическая разница (с точки зрения системных служб, окружающих их) заключается в том, что реализация мьютекса направлена ​​на то, чтобы быть более легким механизмом синхронизации. В оракуле говорят, что мьютексы известны как latches а семафоры известны как waits .

На самом низком уровне они используют какой-то атомный тест и механизм набора . Это считывает текущее значение ячейки памяти, вычисляет какое-то условное выражение и записывает значение в этом месте в одной команде, которая не может быть прервана . Это означает, что вы можете получить мьютекс и тест, чтобы узнать, есть ли у кого-либо еще это перед вами.

Типичная реализация мьютекса имеет процесс или поток, выполняющий инструкцию test-and-set и оценивающую, установил ли что-нибудь еще мьютекс. Ключевым моментом здесь является отсутствие взаимодействия с scheduler , поэтому мы понятия не имеем (и не заботимся), кто установил блокировку. Затем мы либо отказываемся от своего временного фрагмента, и снова пытаемся его снова, когда задача перепланируется или выполняет spin-lock . Блокировка спина представляет собой алгоритм, такой как:

Count down from 5000:
     i. Execute the test-and-set instruction
    ii. If the mutex is clear, we have acquired it in the previous instruction 
        so we can exit the loop
   iii. When we get to zero, give up our time slice.

Когда мы закончили выполнение нашего защищенного кода (известного как критический раздел ), мы просто установили значение mutex равным нулю или что-то другое означает «clear». Если несколько задач пытаются получить мьютекс, следующая задача, которая будет запланирована после выхода мьютекса, получит доступ к ресурсу. Как правило, вы должны использовать мьютексы для управления синхронизированным ресурсом, где эксклюзивный доступ требуется только в течение очень коротких периодов времени, обычно для обновления общей структуры данных.

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

Основной алгоритм семафора выглядит так:

(somewhere in the program startup)
Initialise the semaphore to its start-up value.

Acquiring a semaphore
   i. (synchronised) Attempt to decrement the semaphore value
  ii. If the value would be less than zero, put the task on the tail of the list of tasks waiting on the semaphore and give up the time slice.

Posting a semaphore
   i. (synchronised) Increment the semaphore value
  ii. If the value is greater or equal to the amount requested in the post at the front of the queue, take that task off the queue and make it runnable.  
 iii. Repeat (ii) for all tasks until the posted value is exhausted or there are no more tasks waiting.

В случае двоичного семафора основной практической разницей между ними является характер системных сервисов, окружающих фактическую структуру данных.

EDIT: Как справедливо заметил Эван, спин-блокировки замедляют работу одного процессора. Вы бы использовали только спин-блокировку на многопроцессорном ящике, потому что на одном процессоре процесс, содержащий мьютекс, никогда не перезагрузит его, пока выполняется другая задача. Spinlocks полезны только для многопроцессорных архитектур.


Ответ может зависеть от целевой ОС. Например, по крайней мере одна реализация RTOS, с которой я знаком, позволит несколько последовательных операций «получить» против одного мьютекса операционной системы, если они все из одного и того же контекста потока. Множественные get должны быть заменены равным количеством пометок, прежде чем другой поток будет разрешен для получения мьютекса. Это отличается от двоичных семафоров, для которых допускается только один доступ за раз, независимо от контекстов потоков.

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

{
    mutexGet();  // Other threads can no longer get the mutex.

    // Make changes to the protected object.
    // ...

    objectModify();  // Also gets/puts the mutex.  Only allowed from this thread context.

    // Make more changes to the protected object.
    // ...

    mutexPut();  // Finally allows other threads to get the mutex.
}

Конечно, при использовании этой функции вы должны быть уверены, что все обращения в одном потоке действительно безопасны!

Я не уверен, насколько распространен этот подход, или применяется ли он за пределами систем, с которыми я знаком. Пример такого мьютекса см. В RTOS ThreadX.


Поскольку ни один из приведенных выше ответов не устраняет путаницу, вот один из них, который очистил мое замешательство.

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

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

Источник: http://www.geeksforgeeks.org/mutex-vs-semaphore/


Разница между двоичным семафором и мьютексом: СОБСТВЕННОСТЬ: Семафоры могут сигнализироваться (отправляться) даже от текущего владельца. Это означает, что вы можете просто публиковать сообщения из любого другого потока, хотя вы не являетесь его владельцем.

Семафор - это государственная собственность в процессе, она может быть просто отправлена ​​потоком не владельца. Пожалуйста, отметьте это различие буквами BOLD, это много значит.


Хотя двоичный семафор может использоваться как мьютекс, мьютекс является более конкретным прецедентом, поскольку предполагается, что он блокирует только мьютекс. Это ограничение собственности позволяет обеспечить защиту от:

  • Случайное освобождение
  • Рекурсивный тупик
  • Задача Смертельный тупик

Эти ограничения не всегда присутствуют, потому что они ухудшают скорость. Во время разработки кода вы можете временно включить эти проверки.

например, вы можете включить атрибут проверки ошибок в вашем мьютексе. Ошибка проверки мьютексов возвращает EDEADLK если вы попытаетесь заблокировать один и тот же EDEADLK дважды, и EPERM если вы разблокируете мьютекс, который не принадлежит вам.

pthread_mutex_t mutex;
pthread_mutexattr_t attr;
pthread_mutexattr_init (&attr);
pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_ERRORCHECK_NP);
pthread_mutex_init (&mutex, &attr);

После инициализации мы можем поместить эти проверки в наш код следующим образом:

if(pthread_mutex_unlock(&mutex)==EPERM)
 printf("Unlock failed:Mutex not owned by this thread\n");

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


Пример туалета - приятная аналогия:

мьютекс:

Является ключом к туалету. Один человек может иметь ключ - занимать туалет - в то время. По завершении, человек дает (освобождает) ключ к следующему человеку в очереди.

Официально: «Мьютексы обычно используются для сериализации доступа к разделу кода повторного входа, который не может выполняться одновременно более чем одним потоком. Объект mutex разрешает только один поток в контролируемый раздел, заставляя другие потоки пытаться получить доступ к этот раздел должен ждать, пока первый поток не выйдет из этого раздела ». Ссылка: Symbian Developer Library

(Мьютекс - действительно семафор со значением 1.)

Семафор:

Является ли количество свободных идентичных туалетных ключей. Например, у нас есть четыре туалета с одинаковыми замками и ключами. Счет семафора - количество ключей - устанавливается в начале 4 (все четыре туалета являются свободными), тогда значение счета уменьшается по мере поступления людей. Если все туалеты заполнены, то есть. свободных ключей нет, счет семафора равен 0. Теперь, когда уравнение один человек выходит из туалета, семафор увеличивается до 1 (один свободный ключ) и передается следующему человеку в очереди.

Официально: «Семафор ограничивает количество одновременных пользователей общего ресурса до максимального числа. Темы могут запрашивать доступ к ресурсу (уменьшая семафор) и могут сигнализировать, что они закончили использовать ресурс (увеличивая семафор). " Ссылка: Symbian Developer Library


http://www.geeksforgeeks.org/archives/9102 подробно обсуждается.

Mutex - механизм блокировки, используемый для синхронизации доступа к ресурсу. Semaphore является сигнальным механизмом.

Его до программиста, если он хочет использовать двоичный семафор вместо мьютекса.


Как упоминало многие люди, мьютекс используется для защиты критического фрагмента кода (критический раздел AKA). Вы получите мьютекс (блокировку), введите критический раздел и отпустите мьютексы (разблокировать) все в одном потоке .

Используя семафор, вы можете заставить поток ждать на семафоре (скажем, поток A), пока другой поток (скажем, нить B) не завершит любую задачу, а затем задает Семафор для потока A, чтобы остановить ожидание и продолжить его задачу.


Мьютекс и двоичный семафор - одно и то же, но на самом деле они разные. В случае мьютекса, The Thread, который заблокировал его, только это может разблокировать его. Если какой-либо другой поток приходит, чтобы заблокировать его, он будет ждать. Но в случае семафона, это не так. Семафор не связан с идентификатором мутной жидкости.


У мьютексов есть собственность, в отличие от семафоров. Хотя любой поток, в рамках мьютекса, может получить разблокированный мьютекс и заблокировать доступ к тому же критическому разделу кода, только тот поток, который заблокировал мьютекс, должен его разблокировать .


  • Мьютекс , по определению, используется для сериализации доступа к разделу кода повторного входа, который не может выполняться одновременно более чем одним потоком.

  • Семафор по определению ограничивает количество одновременных пользователей общего ресурса до максимального числа

  • Семафор может быть Mutex, но Mutex никогда не может быть семафором. Это просто означает, что используется двоичный семафор ca n
    как Mutex, но Mutex никогда не может демонстрировать функциональность семафора.

  • Как семафоры, так и Mutex (по крайней мере, на последнем ядре) носят нерекурсивный характер.
  • Никто не владеет семафорами, тогда как Mutex принадлежит и владелец несет за них ответственность. Это важное отличие от перспективы отладки.
  • В случае Mutex поток, который владеет Mutex, отвечает за его освобождение. Однако в случае семафоров это условие не требуется. Любой другой поток может сигнализировать, чтобы освободить семафор, используя smps (function.e_ot)

  • Еще одно отличие, которое имеет значение для разработчиков, заключается в том, что семафоры являются системными и остаются в виде файлов в файловой системе, если они не очищены иным образом. Mutex обрабатываются по всей стране и автоматически очищаются при выходе из процесса.

  • Характер семафоров позволяет использовать их в синхронизации связанных и несвязанных процессов, а также между потоками. Mutex можно использовать только в синхронизации между потоками и, самое большее, между связанными процессами (реализация pthread последнего ядра поставляется с функцией, которая позволяет использовать Mutex между связанными процессами).
  • Согласно документации ядра, Mutex легче по сравнению с семафорами. Это означает, что программа с использованием семафора имеет больший объем памяти по сравнению с программой, имеющей Mutex.
  • С точки зрения использования, Mutex имеет более простую семантику по сравнению с семафорами.