操作系統之線程篇2

1.  

出現上面的問題是基於兩個原因:errno是線程之間共享的全局變量;線程之間的相互執行順序是不確定的。消除第一個原因的辦法就是限制全局變量,給每一個線程一個私有的errno,但是這在一定範圍內是違背了線程設計的初衷,就是資源的共享,提高資源的利用率。消除第二個原因的辦法就是讓線程之間的相對執行順序在需要的時候可以確定。引入線程的一個最具大的問題其實就是多線程的執行結果可能是不確定的,其次是執行效率,爲了最大的消除這種多線程執行結果的不確定性,我們引出了線程的同步。

2. 兩個或多個線程競相訪問同一段代碼或訪問同一個資源的現象稱爲競爭,這個可能造成競爭的共享代碼或資源稱爲臨界區。競爭可能有代碼的競爭和數據變量的進程。

3. 鎖有兩個基本操作:閉鎖和開鎖。

1)閉鎖操作有兩個步驟,分別如下:等待鎖達到打開狀態;獲得鎖並鎖上。

2)開鎖就一步:打開鎖。

注:閉鎖的操作應該是原子操作,即不能分開,不然就會留下穿插的空檔,從而造成鎖的失效。這裏又有另一個問題等待會造成資源的浪費,並且可能造成CPU調度的優先級倒掛,優先級倒掛就是高優先級的線程等待低優先級的線程。必須有防止死鎖的機制。

4.我們引出又一種機制來解決等待可能產生的問題,就是休眠和叫醒。一個程序進入休眠狀態將釋放其所佔用的資源。

5.爲了解決線程的同步,我們發明了鎖,但鎖的出現帶來了循環等待,爲了消除循環等待,我們發明了休眠和叫醒,休眠和叫醒又帶來了死鎖的問題,因此我們再次發明了信號量,那麼信號量是不是我們的終極原語呢?信號量又帶來了什麼問題?使用信號量原語時,信號量操作的順序至關重要,稍有不慎,就可能死鎖。如果一個程序有很多信號量時,程序員將很難搞清楚準確的順序到底是什麼,這是死鎖和低效率幾乎是肯定的,如是我們又改進引入管程的機制,它監視的就是進程或線程的同步操作。

6.  



7.管程的最大問題就是對編譯器的依賴,另外管程只能在單臺計算機上發揮作用,如果我們想在多計算機環境下進行同步(如網絡環境),就又引出了消息傳遞的機制。消息傳遞是當前使用非常普遍的線程同步機制。

8. 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章