信號量vs監視器
信號量是一種數據結構,用於確保在並行編程環境中多個進程不會同時訪問一個公共資源或一個關鍵部分。信號量用於避免死鎖和爭用情況。Monitor是一種編程語言構造,它也用於避免多個進程同時訪問一個公共資源,因此可以保證互斥。監視器使用條件變量來完成此任務。
什麼是信號量?
信號量是一種數據結構,用於為關鍵部分提供互斥。信號量主要支持wait(歷史上稱為P)和signal(歷史上稱為V)兩種操作。wait操作阻塞一個進程,直到信號量打開,信號操作允許另一個進程(線程)進入。每個信號量都與一個等待進程的隊列相關聯。當等待操作被線程調用時,如果信號量是打開的,線程可以繼續。如果等待操作被線程調用時信號量關閉,則線程被阻塞,它必須在隊列中等待。signal操作打開一個信號量,如果隊列中已經有線程在等待,則允許該進程繼續,如果隊列中沒有等待的線程,則會為下一個線程記住該信號。有兩種類型的信號量稱為互斥信號量和計數信號量。互斥信號量允許對一個資源進行單一訪問,計數信號量允許多個線程訪問一個資源(該資源有多個可用單元)。
什麼是監視器?
監視器是一種編程語言結構,用於控制對共享數據的訪問。監視器封裝共享數據結構、過程(在共享數據結構上操作)和併發過程調用之間的同步。監視器確保其數據不會面臨非結構化訪問,並保證treads(通過其過程訪問monitor的數據)以合法的方式交互。監視器通過在給定時間只允許一個線程執行任何監視器過程來保證互斥。如果另一個線程試圖調用監視器中的某個方法,而某個線程已經在監視器中執行一個過程,那麼第二個過程將被阻塞,它必須在隊列中等待。有兩種類型的監視器,稱為霍爾監視器和檯面監視器。它們主要在調度語義上有所不同。
信號量和監視器有什麼區別?