Использование встроенных атомарных функций вместо семафоров

#operating-system

#операционная система

Вопрос:

Кто-нибудь может объяснить, как можно использовать встроенные атомарные функции в качестве альтернативы семафорам?

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

Я не понял этого использования встроенных атомарных функций для доступа к глобальной памяти процессора.

Спасибо, Ивак.

Ответ №1:

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

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

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

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

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