訊號量如何用於實現互斥?
訊號量是一個共享變數,用於實現系統程序之間的互斥。它主要用於解決臨界區問題,是一種實現程序同步的技術。
訊號量主要有以下兩種型別:
二元訊號量 - 只能取0或1兩個值,這意味著一次只有一個程序可以進入臨界區。訊號量初始化為1。
計數訊號量 - 可以取任何非負值N,這意味著一次最多可以有N個程序進入臨界區。訊號量初始化為N。
臨界區由P和V操作包圍,如下所示:
P(s)
臨界區 (CS)
V(s)
每個操作的定義如下:
等待(P) - 當一個程序進入臨界區時,它首先執行P操作,該操作會減少訊號量的值;如果之後s>=0,則進入臨界區;否則加入等待佇列。
P(Semaphore s) { s = s - 1; if (s < 0) { block(p); } }
訊號(V) - 當一個程序退出臨界區時,執行V操作,該操作會增加訊號量的值,表明另一個當前被P操作阻塞的程序可以進入臨界區。
V(Semaphore s) { s = s + 1; if (s >= 0) { wakeup(p); } }
讓我們看看如何使用鎖變數來引入互斥:
它使用與訊號量類似的機制,但一次只有一個程序可以進入臨界區,並使用鎖變數來實現同步,如下所示:
while(lock != 0); Lock = 1; //critical section Lock = 0;
它檢查鎖是否等於0,如果是,則將鎖設定為1,表示鎖已被佔用,然後進入臨界區。如果鎖不為0,則等待直到鎖可用。退出臨界區時,將鎖恢復為0,表示鎖可用,另一個程序可以進入臨界區。
鎖和訊號量的區別在於,鎖可以在使用者模式下實現,而訊號量在核心模式下實現。此外,鎖只允許一個程序進入臨界區,而訊號量可以允許多個程序進入臨界區。簡而言之,訊號量是鎖的泛化。
廣告