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