Операции P() и V() могут выполняться на атоме семафора-гаранта? Может ли семафор предотвращать попадание двух процессов в P()?
Являются ли атомы Семафор Р и V?
Ответ 1
Предположим, что у нас есть двоичный семафор, s, который имеет значение 1, а два процесса одновременно пытаются выполнить P на s. Только одна из этих операций будет выполнена до следующей V-операции на s; другой процесс, пытающийся выполнить операцию P, приостанавливается.
Взято из моих университетских заметок:
Мы можем думать, что если P и V управляют доступ к ресурсу:
Когда процесс хочет использовать ресурс, он выполняет операцию P: если это удастся, оно уменьшает количество доступных ресурсов и процесс продолжается; если все ресурс в настоящее время используется, процесс должен ждать.
Когда процесс завершается ресурс, он выполняет операцию V: если бы процессы, ожидающие ресурс, один из них проснулся,
если не было ожидающих процессов, семафор увеличивается что теперь есть больше ресурс бесплатный. Обратите внимание, что определение V не определяет, какие процесс пробуждается, если более одного процесс был приостановлен на том же семафор.
Семафоры могут решать как проблемы взаимного исключения, так и проблемы синхронизации. Поэтому ответ на оба вопроса: да.
Ответ 2
Если я правильно помню, да, они есть. Они должны быть в том, чтобы гарантировать, что один поток не может получить ресурсы, а другой поток. Если бы это было не так, это означало бы, что два потока могут начать доступ к ресурсу, а затем будут отключены от ЦП, а другой процесс может получить к нему доступ. Это немного портит ситуацию.
Смотрите здесь для получения дополнительной информации: http://en.wikipedia.org/wiki/Semaphore_(programming)#Semantics_and_Implementation