文章目錄
- 1、線程的基本概念、線程的基本狀態及狀態之間的關係。
- 2、線程與進程的區別
- 3、線程的同步與互斥
- 4、死結產生的原因以及如何避免死結
1、線程的基本概念、線程的基本狀態及狀態之間的關係。
(1)線程的概念
-------1) 線程最直接的理解就是“輕量級進程”,它是一個基本的CPU執行單元,也是程式執行流的最小單位,由線程ID、程式計數器、寄存器集合和堆棧組成。
-------2) 線程是進程中的一個實體,是被系統獨立調度和指派的基本單位。線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可以與同屬一個進程的其它線程共用進程所擁有的全部資源。
-------3)不同的線程可以執行相同的程式,即同一個服務被不同的使用者調用時,作業系統為它們建立成不同的線程。
-------4)線程是處理機的獨立調度單位,多個線程是可以並發執行的。在單CPU的電腦系統中,各線程可以交替的佔用CPU,在多CPU的電腦系統中,各線程可以同時佔用不同的CPU,若各個CPU同時為一個進程內的各線程服務則可縮短進程的處理周期。
(2)線程的基本狀態
線程也有就緒、阻塞和運行三種狀態。
執行狀態表示線程正在獲得處理機而運行
就緒狀態指線程已具備了各種執行條件,一旦獲得CPU便可執行檔狀態
阻塞狀態指線程在執行中因某事件而受阻,處於暫停執行的狀態。
2、線程與進程的區別
1)調度
在傳統的作業系統中,擁有資源和獨立調度的基本單位都是進程。在引入線程的作業系統中,線程是獨立調度的基本單位,進程是擁有資源的基本單位。在同一進程中,線程的切換不會引起進程切換。在不同的進程中進行線程切換,如從一個進程內的線程切換到另一個進程中的線程時,會引起進程切換。
2)擁有資源
不論是傳統的作業系統還是擁有線程的作業系統,進程都是擁有資源的基本單位,而線程不擁有資源(只有一點必不可少的資源),但線程可以訪問其隸屬進程的系統資源。
3)並發性
在引入線程的作業系統中,不僅進程間可以並發執行,同一進程內的多個線程間也可以並發執行,從而使作業系統具有更好的並發性,提高了系統輸送量。
4)系統開銷
由於建立或撤銷進程時,系統都要為之分配或回收資源,如記憶體空間、IO裝置等,因此作業系統所付出的開銷遠大於建立或撤銷線程時的開銷。類似的,進行進程切換時,涉及當前執行過程CPU環境的儲存及新調度到進程CPU環境的設定,而線程切換隻需要儲存和設定少量的寄存器內容,開銷很小。此外,由於同一進程內的多個線程共用進程的地址空間,因此,這些線程之間的同步與通訊非常容易實現,甚至無需作業系統的幹預。
5)地址空間和其它資源
進程的地址空間相互獨立,同一進程的各線程共用進程的資源,而進程內的線程對其它進程不可見。
6)通訊方面
處理序間通訊(IPC)需要進程同步和互斥手段的輔助,以保證資料的一致性,而線程間可以直接讀/寫進程資料區段(如全域變數)來進行通訊。
3、線程的同步與互斥
線程同步的方法主要有以下四種:
-------1)臨界區(Critical Section):通過臨界區實現多個線程對同一公用資源或一段代碼的串列訪問,速度快,適合控制資料的訪問。
保證某一時刻只有一個線程訪問某一資源的簡便方法。任意時刻只允許一個線程對資源的訪問。如果同一時刻由多個線程試圖訪問臨界區,則其中一個線程進入臨界區後,其它線程將會被掛起等待,並一直持續到該線程退出臨界區。當臨界區被釋放後,其它線程可以搶佔,並以此達到原子方式操作共用資源的目的。
臨界區的兩個原語:EnterCriticalSection() 進入臨界區;LeaveCriticalSection()退出臨界區。
-------2)互斥量(Mutex):通過協調線程共同對一個共用資源的單獨訪問而設計。
互斥量跟臨界區很相似,只有擁有互斥對象的線程才具有訪問資源的許可權。由於互斥對象只有一個,因此就決定了同時只有一個線程擁有對資源的存取權限。當前佔據資源的線程在任務處理完成後交付互斥對象,以便其它線程可以擁有該互斥對象實現對資源的控制訪問。互斥量比臨界區複雜,互斥量不僅可以實現同一應用程式的不同線程間的同步,而且可以實現不同程式間線程的對資源的安全共用。
互斥量包含的幾個操作原語:
CreateMutex()建立互斥量
OpenMutex()開啟互斥量
ReleaseMutex()釋放互斥量
WaitForMultipleObjects() 等待互斥對象
-------3)訊號量(Semaphores):可以控制有限使用者對同一資源的的訪問而設計;
訊號量對線程同步的方法與前幾種不同,訊號量允許多個線程同時使用共用資源,這與作業系統中的PV操作相同。它指出了同時訪問共用資源的最大線程數目。它允許多個線程在同一時刻訪問同一資源,但是限制了同一時刻訪問資源的最大線程數目。在用CreateSemaphore()建立訊號量時,要同時指出允許訪問的最大資源基數和當前可用資源計數。一般把當前可用資源計數作為最大資源計數,即每增加一個線程對資源的訪問相應的資源計數就會減一,只要當前可用資源計數是大於0的,就可以發出訊號量訊號。但是當前可用資源減小到小於0時,則說明當前佔用資源的線程數目已經達到最大,不允許線程的繼續進入,此時訊號量也無法發出。當線程處理完資源後,應該離開的同時通過ReleaseSemaphore()使資源計數加1。在任何時候當前可用資源數目不可用大於最大資源數目。
PV操作是由荷蘭科學家提出的。訊號量S是一個整數,當S大於等於0時,代表可給並發進程使用的資源實體,但S小於零正在等待使用共用資源的數目。
P操作申請資源:
(1)S減1
(2)若S減1後仍大於等於0,則進程繼續;
(3)若S減1後小於0,則進程被阻塞後放入該訊號相應的隊列中,然後轉入進程調度;
V操作釋放資源:
(1)S加1操作;
(2)若S加1後大於0,則進程繼續執行;
(3)若S加1小於等於0,則從訊號量的等待隊列中喚醒一個等待進程,然後再返回原進程繼續執行或轉入進程調度。
訊號量包含的幾個操作原語:
CreateSemphore()建立一個訊號量;
OpenSemphore()開啟一個訊號量;
ReleaseSemaphore()退出一個訊號量;
WaitForSingleObject()等待一個訊號量
------4)事件(Event):通過通知線程的有一些事件已經發生,從而可以啟動後續的任務執行。
事件對象也可以通過通知操作的方式保持線程同步,可以實現不同進程中的線程同步操作;
總結:
1)互斥量與臨界區的作用非常相似。但互斥量是可以命名的,也就是說可以擴進程使用,所以建立互斥所需的資源更多,所以如果為了在進程內部使用的話,可以通過臨界區來提高速度上的優勢,並且可以減少資源的使用。互斥量是跨進程的,一旦被建立就可以通過名字開啟。
2)互斥量、訊號量和事件都可以被跨越進程來進行進程同步資料操作,而其他的對象與資料同步操作無關,但對於進程和線程來講,如果進程和線程在運行狀態為無訊號狀態,在退出後為有訊號狀態。所以可以使用WaitForSingleObject來等待進程和線程退出。
3)通過互斥量可以指定資源獨佔的方式使用,但如果有下面一種情況,訊號量就無法處理,比如一個使用者購買了一份三個並發訪問許可的資料可系統,可以根據使用者購買的訪問許可數量來決定由多少個線程/進程能同時進行資料庫操作,這時候如果利用互斥量就沒有辦法完成請求,可以使用訊號量。
4、死結產生的原因以及如何避免死結
產生死結的主要原因是
1)系統資源不足
2)進程運行推進的順序不合適
3)資源分派不當
產生死結的4個必要條件
1)互斥條件:一個資源每次只能被一個進程使用
2)請求與保持條件:一個進程因請求資源而被阻塞時,對已獲得的資源保持不放
3)不剝脫條件:進程已獲得的資源在未使用完之前不被強行剝奪
4)迴圈等待條件:若干進程之前形成一種頭尾相接的迴圈等待資源關係
如何避免死結
在系統設計進程調度等方面注意不讓這四個條件成立,確定資源的合理分配演算法,避免進程永久佔據系統資源。