信号量vs监视器
信号量是一种数据结构,用于确保在并行编程环境中多个进程不会同时访问一个公共资源或一个关键部分。信号量用于避免死锁和争用情况。Monitor是一种编程语言构造,它也用于避免多个进程同时访问一个公共资源,因此可以保证互斥。监视器使用条件变量来完成此任务。
什么是信号量?
信号量是一种数据结构,用于为关键部分提供互斥。信号量主要支持wait(历史上称为P)和signal(历史上称为V)两种操作。wait操作阻塞一个进程,直到信号量打开,信号操作允许另一个进程(线程)进入。每个信号量都与一个等待进程的队列相关联。当等待操作被线程调用时,如果信号量是打开的,线程可以继续。如果等待操作被线程调用时信号量关闭,则线程被阻塞,它必须在队列中等待。signal操作打开一个信号量,如果队列中已经有线程在等待,则允许该进程继续,如果队列中没有等待的线程,则会为下一个线程记住该信号。有两种类型的信号量称为互斥信号量和计数信号量。互斥信号量允许对一个资源进行单一访问,计数信号量允许多个线程访问一个资源(该资源有多个可用单元)。
什么是监视器?
监视器是一种编程语言结构,用于控制对共享数据的访问。监视器封装共享数据结构、过程(在共享数据结构上操作)和并发过程调用之间的同步。监视器确保其数据不会面临非结构化访问,并保证treads(通过其过程访问monitor的数据)以合法的方式交互。监视器通过在给定时间只允许一个线程执行任何监视器过程来保证互斥。如果另一个线程试图调用监视器中的某个方法,而某个线程已经在监视器中执行一个过程,那么第二个过程将被阻塞,它必须在队列中等待。有两种类型的监视器,称为霍尔监视器和台面监视器。它们主要在调度语义上有所不同。
信号量和监视器有什么区别?