程序同步與訊號量

2021-10-23 16:30:27 字數 1683 閱讀 1943

二.訊號量臨界區保護

三.訊號量的**實現

訊號量是用來記錄可用資源等待執行緒數目的一種特殊的整形變數通過對訊號量的修改,使得各個程序得以有序推進,完成程序同步。

訊號量的**定義

struct semaphore
兩種基本操作

/*當程序申請消費資源時執行p函式。首先將資源數目value減一,然後判斷value是否小於0。

如果小於0,則說明該程序嘗試呼叫資源之前系統中資源數目已經為0了。這個時候該程序就將

進行休眠,進入等待狀態*/

p(semaphore s)

}/*當程序申請產生資源時執行v函式。將系統資源個數加一,判斷value的值是否小於等於0(

如果value加一後仍然 <= 0,則說明原本的value一定是小於0的,也就意味著等待佇列中存

在休眠程序。),如果滿足,則喚醒等待佇列中的消費者程序。*/

對於一些共享變數的訪問和修改,我們需要保證它在同一時刻只被唯一乙個程序訪問修改。訊號量就是這樣的共享變數,包含這種變數的**塊叫做臨界區

1.互斥進入:臨界區中最多同時允許乙個程序進入執行

2.有空讓進:當臨界區空閒時,如果此時存在程序等待進入臨界區,則應該讓該程序盡快進入。

3.有限等待:從程序發出進入請求到允許進入的時間必須是有限的,不能無限等待。

麵包店演算法體現了標記思想輪轉思想的結合:每乙個申請進入的程序都將按照從小到大的順序獲得乙個大於0的序號,序號最小的優先執行,程序執行結束後修改序號為0,代表執行完畢。如果之後該程序又需要重新執行臨界區**,則需要重新取號排隊等待

回顧一下多程序排程產生安全問題的原因:當乙個程序在對共享變數進行訪問和修改時,恰好在這個過程中時間片用完了,該程序被迫中斷,其他的程序被喚醒也進入了臨界區。最終就可能會導致共享變數的資料錯誤。

為了解決這個問題,在單核單cpu系統中,我們可以在程序執行到臨界區**時阻止其餘程序的排程,將臨界區**類似看作原子操作。具體而言就是在執行臨界區**前使用cli()函式(乙個內嵌彙編函式)阻止排程,執行完畢後再使用sti()函式恢復正常排程。

通過在臨界區**塊加上鎖來實現原子操作,從而實現了臨界區**保護。

關於鎖的本質,其實也類似於訊號量,可以視作一種特殊的整形變數,這也就意味著鎖也需要得到其他變數的保護。如果這個工作交由程式來做,最終的結果就是套娃,子子孫孫,無窮盡也…因此,這裡對於鎖的保護是由硬體完成的

…開學之後做實驗任務時補上…

程序同步與訊號量

對於多個程序訪問共享資料,需要程序進行同步合作完成操作。我們可以使用訊號量來描述共享資料。struct semaphore p semaphore s v semaphore s 這樣的話當我們訪問共享資料時,我們可以先呼叫p操作,訪問結束後呼叫v操作,這樣就可以當成程序同步的目的。使用訊號量的問題...

16 程序同步與死鎖 程序同步與訊號量

司機 while true 售票員 while true 印表機按照列印佇列執行列印,當列印佇列中有 6個列印任務,2個程序同時新增列印任務,列印佇列的第7個任務是哪個,需要協調 小結 程序有自己的執行條件,有時執行 有時等待,執行完 可能也要 發出訊號,讓等待該訊號的其他程序執行 程序同步 就是 ...

程序同步 訊號量機制

由dijkstra提出,目前已廣泛應用於單處理機和多處理機系統以及計算機網路中。一 整形訊號量 1.s 乙個用於表示資源數目的整型量 2.與一般整型量不同,除初始化外,僅能通過兩個標準的原子操作 wait s 和signal s 長期以來一直被稱為p v操作 3.wait操作偽碼描述 wait s ...