如果有兩個或者兩個以上的任務(進程 / 線程,并發的實體),去訪問一個共享資源(硬件上面的,軟件上的)。我們必須要保證這個共享資源的有序訪問,否則會產生不可預知的后果
?? ?例子:
?? ?very_important_i = 5; // 共享資源
?? ?
?? ?fun() {
?? ??? ?very_important_i++;
?? ?}
?? ?有兩個任務同時調用了fun()這個函數,那么請問very_important_i 最后的值是多少?
?? ??? ??? ?7 ----> 有可能
?? ??? ??? ?6 ----> 有可能,不是我們期望的結果
?? ??? ??? ?8 ?不可能
?? ??? ??? ?5 ?不可能
?并發:任務(進程)在任意時刻都是有可能被暫停的
?? ??? ?出現結果為6,就不是對共享資源的有序訪問,是有問題的,所以我們需要對這個共享資源進行某一種方式的保護,以使它有序訪問
?? ??? ?“避免競爭”
?? ??? ?
并發可以提高cpu利用率,有可能造成競爭,造成共享資源的非法訪問,程序行為異常....
?? ?
解決方法:
?? ?能不能不要并發呢?
?? ?顯然不可以
?? ?
?? ?在保留并發的前提下,"避免競爭",在訪問共享資源時,嚴格的串行
??1. 信號量(semaphore)機制
信號量是什么?
????????信號量的作用是什么?
? ? ? ? 為什么需要信號量?
? ? ? ? 信號量的工作原理是什么?????????信號量(semaphore)是一種用于提供不同進程或者一個進程內部不同的線程間同步“避免競爭”的一種機制
?? ?
????????進程/線程,任務:并發的實體
? ? ? ? “同步”:并發的實體之間,相互等待,相互制約的一種機制
?? ??? ?保證實體對共享資源有條件的訪問
?? ?
????????信號量就是為了保護共享資源,讓共享資源有序訪問的一種機制
? ? ? ? 信號量的目的:為了保護共享資源,使共享資源有序訪問
?? ?
?? ?信號量是程序界最高尚的一個東西,因為它不是為了自己而存在的,它是為了別人(它要保護的對象,共享資源)而存在的,"保鏢"
2. 信號量是如何工作的
信號量是為了保護共享資源(大家都可以訪問到的資源)有序的訪問
?? ?信號量機制其實是程序員之間的一種約定,用來保護共享資源的
?? ?如:進程A和進程B,都需要訪問一個共享資源“互斥設備”,那么我們可以使用一個信號量來表示能不能訪問這個資源,每一個進程需要訪問共享資源前,先去訪問該信號量,如果能訪問共享資源(信號量允許),則先把信號量設置為"NO",然后再去訪問該共享資源,訪問完共享資源,再把信號量設置為“YES”
?