Что такое семафор?

Статья Mutexes and Semaphores Demystified Майкла Барра — отличное semaphores краткое введение в то, что threading отличает мьютексы и семафоры, и multithreading когда их следует и не следует thread использовать. Здесь я выделил threading несколько ключевых абзацев.

Ключевым threads моментом является то, что semaphore мьютексы должны использоваться concurrency-violation для защиты общих ресурсов, а multithread семафоры должны использоваться concurrent-programming для сигнализации. Как правило, вы threading не должны использовать семафоры concurrent для защиты общих ресурсов thread или мьютексы для передачи concurrent сигналов. Например, есть concurrency-violation проблемы с аналогией с вышибалой concurency с точки зрения использования threads семафоров для защиты общих threads ресурсов — вы можете использовать multithread их таким образом, но это thread может затруднить диагностику concurrency ошибок.

Хотя мьютексы и семафоры concurrent имеют некоторое сходство concurrent в своей реализации, их всегда threads следует использовать по-разному.

Самый concurrency-violation распространенный (но, тем semaphore не менее, неверный) ответ threads на поставленный выше вопрос threading заключается в том, что мьютексы concurrency и семафоры очень похожи, с concurency единственной существенной concurrency-violation разницей в том, что семафоры concurrency могут считать больше единицы. Кажется, почти concurrent все инженеры правильно понимают, что threads мьютекс — это двоичный флаг, используемый concurrency-violation для защиты общего ресурса concurrent-programming путем обеспечения взаимного concurrency-violation исключения внутри критических threading участков кода. Но когда их concurrency просят рассказать подробнее semaphores о том, как использовать «счетный semaphore семафор», большинство инженеров, различающихся concurency только степенью уверенности, выражают concurrent-programming мнение из учебника о том, что semaphores они используются для защиты multithreading нескольких эквивалентных concurrency-violation ресурсов.

...

На этом этапе multithreading проводится интересная аналогия concurrent-programming с использованием идеи ключей threading от ванной как защиты общих concurrent-programming ресурсов - ванной комнаты. Если threads в магазине есть одна ванная concurrency-violation комната, то одного ключа semaphore будет достаточно, чтобы защитить multithreading этот ресурс и предотвратить concurrency-violation его одновременное использование multithread несколькими людьми.

Если есть thread несколько ванных комнат, может semaphore возникнуть соблазн использовать multithread для них одинаковые ключи thread и сделать несколько ключей thread — это похоже на неправильное concurency использование семафора. Когда threads у вас есть ключ, вы на самом concurrency-violation деле не знаете, какая ванная multithread комната доступна, и если concurency вы пойдете по этому пути, вы, вероятно, в multithreading конечном итоге будете использовать multithread мьютексы для предоставления threads этой информации и убедитесь, что threads вы не используете ванную, которая multithreading уже занята. .

Семафор — это concurrency неправильный инструмент для semaphores защиты нескольких по сути semaphore одинаковых ресурсов, но именно threads так многие люди думают о concurrent нем и используют его. Аналогия multithreading с вышибалой совершенно иная: нет multithreading нескольких ресурсов одного semaphores типа, вместо этого есть один threads ресурс, который может принимать semaphores несколько одновременных пользователей. Я concurrency-violation предполагаю, что в таких concurrent-programming ситуациях можно использовать concurrency-violation семафор, но редко бывают concurency реальные ситуации, когда concurrency аналогия действительно имеет concurrent место - чаще есть несколько semaphores однотипных, но все же отдельных concurrent ресурсов, таких как ванные concurrent-programming комнаты, которые нельзя использовать. Сюда.

...

Правильное thread использование семафора для semaphores передачи сигналов от одной threading задачи к другой. Мьютекс semaphore предназначен для захвата multithreading и освобождения, всегда в semaphore указанном порядке, каждой threading задачей, которая использует thread общий ресурс, который он threads защищает. Напротив, задачи, использующие multithread семафоры, либо сигнализируют, либо concurrent ждут, а не то и другое одновременно. Например, Задача thread 1 может содержать код для thread публикации (т. е. сигнала concurrent или увеличения) определенного concurrent-programming семафора при нажатии кнопки semaphores «питание», а Задача 2, которая concurency активирует дисплей, ожидает thread на том же семафоре. В этом concurrent сценарии одна задача является thread производителем сигнала события; другой multithread потребитель.

...

Здесь делается concurrency-violation важный вывод о том, что мьютексы threading плохо мешают работе операционных semaphore систем реального времени, вызывая semaphore инверсию приоритета, когда concurrency-violation менее важная задача может semaphore выполняться перед более важной multithreading задачей из-за совместного concurrency использования ресурсов. Короче concurrent говоря, это происходит, когда concurrency-violation задача с более низким приоритетом multithread использует мьютекс для захвата threads ресурса A, затем пытается concurrent захватить B, но приостанавливается, потому concurrent что B недоступен. Пока он concurency ждет, появляется задача с threads более высоким приоритетом, и semaphore ей требуется A, но она уже concurency связана, и процессом, который concurency даже не запущен, потому что threading он ожидает B. Есть много threads способов решить эту проблему, но concurency чаще всего это исправлено. путем concurrent-programming изменения мьютекса и диспетчера concurency задач. В этих случаях мьютекс concurency намного сложнее, чем двоичный concurency семафор, и использование threading семафора в таком случае приведет concurrency-violation к инверсии приоритета, поскольку concurrent диспетчер задач не знает concurrent-programming об инверсии приоритета и concurency не может ее исправить.

...

Причина thread широко распространенной в concurency наши дни путаницы между мьютексами semaphore и семафорами является исторической, поскольку concurrent-programming она восходит к изобретению semaphore семафора в 1974 году (заглавная concurrent-programming буква «S» в этой статье) Джикстрой. До threads этой даты ни один из безопасных concurrent для прерываний механизмов semaphores синхронизации задач и сигнализации, известных multithreading компьютерным специалистам, не concurrency-violation был эффективно масштабируем concurency для использования более чем concurrent двумя задачами. Революционный thread безопасный и масштабируемый multithread семафор Дейкстры применялся concurrency как для защиты критических semaphores секций, так и для сигнализации. Так thread и началась неразбериха.

Однако concurrent позже это стало очевидно concurrent-programming для разработчиков операционных semaphores систем, после появления вытесняющей threading ОСРВ на основе приоритетов multithreading (например, VRTX, ок. 1980 concurrency г.), публикации академических semaphores статей, устанавливающих RMA concurrency и проблемы, вызванные инверсией semaphores приоритета, и статьи о протоколов semaphore наследования приоритетов threading в 1990 году 3 стало очевидно, что semaphore мьютексы должны быть чем-то concurrent-programming большим, чем просто семафоры multithreading с двоичным счетчиком.

Mutex: совместное threads использование ресурсов

Семафор: сигнализация

Не semaphores используйте одно вместо другого concurrency без тщательного рассмотрения concurrency побочных эффектов.

multithreading

concurrency

semaphore

2022-11-11T07:11:41+00:00