<<操作系統精髓與設計原理>>讀書筆記(一) 併發性:互斥與同步 併發問題是所有問題的基礎,也是操作系統設計的基礎。併發包括很多設計問題,其中有進程間通信,資源共用與競爭,多個進程活動的同步以及分配給進程的處理器時間的。 和併發相關的關鍵術語:原子操作: 一個或多個指令的序列,對外是不可分的;即沒有 ...
<<操作系統精髓與設計原理>>讀書筆記(一) 併發性:互斥與同步
併發問題是所有問題的基礎,也是操作系統設計的基礎。併發包括很多設計問題,其中有進程間通信,資源共用與競爭,多個進程活動的同步以及分配給進程的處理器時間的。
和併發相關的關鍵術語:
原子操作: 一個或多個指令的序列,對外是不可分的;即沒有其他進程可以看到其中間狀態或者中斷此操作。
併發中,為了確保併發下的數據完整性,我們有一系列的同步方法,其實這些就是為了實現互斥性!對臨界區程式的互斥性。有三種方法:
1.軟體方法,但是該方法被證明會增加開銷與缺陷
2.硬體的支持: 專門的機器指令來處理
3.操作系統或程式設計語言提供某種級別的支持
先來講講專門的機器指令來處理吧。
在多處理器配置中,幾個處理器共用記憶體。在這種情況下,不存在主從關係,處理期間的行為是無關的,表現出一種對等關係,處理器之間沒有互斥的中斷機制。
在硬體級別上,對存儲單元的訪問排斥對相同單元的其他訪問。基於這一點,處理器的設計者提出了一些機器指令,用於保證兩個動作的原子性,如在一個取指令周期中對一個存儲器單元的讀與寫或者讀和測試。在該指令執行的過程中,任何其它指令訪問記憶體將被組織。而這些動作將在一個指令周期中完成。
比較和交換指令:
exchange指令
在這裡說句題外話:我之前其實一直納悶原子操作是怎麼回事,原來這是處理器指令的功能,.Net中的CompareExchange()方法與上面的比較與交換指令是一樣的功能,返回的約定也是一模一樣。也算是解除了我的一個疑問!我寫過一篇關於原子操作的文章<<使用Interlocked在多線程下進行原子操作,無鎖無阻塞的實現線程運行狀態判斷>>
信號量:
這是操作系統和用於提供併發性的程式設計語言機制。常用併發機制:
信號量: 用於進程間傳遞信號的一個整數值。在信號量上只有三中操作可以進行,初始化,遞減,增加,這三中操作都是原子操作!遞減可以用於阻塞一個進程,增加操作可以用於接觸阻塞的一個進程。
上過操作系統的同學,如果有印象,那麼應該還記得P/V操作,沒有錯,P/V操作就是我們的信號量。我還記得以前上課的時候,關於信號量最典型的一個示例就是生產者消費者模型,關於生產者消費者的實例應用,可以在我之前的博客裡面找到。當時上課沒有好好聽,不以為然,聽得還迷迷糊糊的,沒有想到工作了的第一個項目就是應用它的場景....不說了。
關於信號量要說的只有兩點:
1.
P操作: 遞減
V操作: 遞增
2.
生產者消費者應用:
可以看到,信號量的P/V操作是基於硬體處理器指令實現的。上圖中的代碼,我大概標註了下s, n , e變數的作用:
n: 是用來通知消費者的,因此初始化為0,是最合適的。
e: 限制緩衝區大小,如果生產者消費者隊列為0或者已滿就會阻塞相關線程
s: 一次允許多少個線程併發訪問,這裡設置的是1個,我們可以設置為10個等。