Семафор против Монитора
Семафор - это структура данных, которая используется для обеспечения одновременного доступа нескольких процессов к общему ресурсу или критическому разделу в средах параллельного программирования. Семафоры используются, чтобы избежать мертвых замков и условий гонки. Монитор - это конструкция языка программирования, которая также используется для предотвращения одновременного доступа нескольких ресурсов к общему ресурсу, что гарантирует взаимное исключение. Для выполнения этой задачи мониторы используют условные переменные.
Что такое семафор?
Семафор - это структура данных, которая используется для взаимного исключения критических разделов. Семафоры в основном поддерживают две операции, называемые wait (исторически известные как P) и signal (исторически известные как V). Операция ожидания блокирует процесс до тех пор, пока семафор не будет открыт, а сигнальная операция не позволит другому процессу (потоку) войти. Каждый семафор связан с очередью ожидающих процессов. Когда операция ожидания вызывается потоком, если семафор открыт, поток может продолжаться. Если семафор закрыт, когда потоком вызывается операция ожидания, поток блокируется и ему приходится ждать в очереди. Сигнальная операция открывает семафор, и если в очереди уже находится поток, ожидающий выполнения, этому процессу разрешается продолжить, и если в очереди нет потоков, сигнал запоминается для следующих потоков. Существует два типа семафоров, называемых семафорами мьютекса и семафорами подсчета. Семафоры Mutex допускают один доступ к ресурсу, а подсчет семафоров позволяет нескольким потокам обращаться к ресурсу (в котором доступно несколько единиц).
Что такое монитор?
Монитор - это конструкция языка программирования, которая используется для управления доступом к общим данным. Мониторы инкапсулируют общие структуры данных, процедуры (которые работают с общими структурами данных) и синхронизацию между одновременными вызовами процедур. Монитор следит за тем, чтобы его данные не сталкивались с неструктурированным доступом, и гарантирует, что протекторы (которые получают доступ к данным монитора через его процедуры) взаимодействуют законным образом. Монитор гарантирует взаимное исключение, позволяя только одному потоку выполнять любую процедуру монитора в данный момент времени. Если другой поток пытается вызвать метод в мониторе, в то время как поток уже выполняет процедуру в мониторе, тогда вторая процедура блокируется, и она должна ждать в очереди. Существует два типа мониторов: мониторы Hoare и мониторы Mesa. Они в основном отличаются семантикой планирования.
В чем разница между семафором и монитором?
Несмотря на то, что и семафоры, и мониторы используются для достижения взаимного исключения в средах параллельного программирования, они различаются в методах, используемых для решения этой задачи. В мониторах код, используемый для достижения взаимного исключения, находится в одном месте и является более структурированным, в то время как код для семафоров распределяется в виде вызовов функций ожидания и сигналов. Кроме того, очень легко совершать ошибки при реализации семафоров, в то время как вероятность реализации ошибок при реализации мониторов очень мала. Кроме того, мониторы используют условные переменные, а семафоры - нет..