1. 進程擁有獨立資源,同一進程中各線程共享資源:安全
2. 線程是同一個進程中代碼的不一樣執行路線。線程不獨立存在,必須存在於某個進程內,當進程結束時,其中的全部線程都將結束。併發
3. 進程是靜態的,沒有活力的,必須擁有至少一個線程,以線程爲單位去搶佔CPU的資源來執行任務。性能
4. 在調度和切換時,線程比進程要快許多。ui
5. 多對多模型結合了一對一模型和多對一模型的優勢,將多個用戶線程映射到多個內核線程上。多對多模型的優勢有:1.一個用戶線程的阻塞不會致使全部線程的阻塞,由於此時還有別的內核線程被調度來執行;2.多對多模型對用戶線程的數量沒有限制;3.在多處理器的操做系統中,多對多模型的線程也能獲得必定的性能提高,但提高的幅度不如一對一模型的高。spa
所謂同步(synchronization)就是指一個線程訪問數據時,其它線程不得對同一個數據進行訪問,即同一時刻只能有一個線程訪問該數據,當這一線程訪問結束時其它線程才能對這它進行訪問。同步最多見的方式就是使用鎖(Lock),也稱爲線程鎖。鎖是一種非強制機制,每個線程在訪問數據或資源以前,首先試圖獲取(Acquire)鎖,並在訪問結束以後釋放(Release)鎖。在鎖被佔用時試圖獲取鎖,線程會進入等待狀態,直到鎖被釋放再次變爲可用。操作系統
1. 二元信號量線程
二元信號量(Binary Semaphore)是一種最簡單的鎖,它有兩種狀態:佔用和非佔用。它適合只能被惟一一個線程獨佔訪問的資源。當二元信號量處於非佔用狀態時,第一個試圖獲取該二元信號量鎖的線程會得到該鎖,並將二元信號量鎖置爲佔用狀態,以後其它試圖獲取該二元信號量的線程會進入等待狀態,直到該鎖被釋放。設計
2. 信號量指針
多元信號量容許多個線程訪問同一個資源,多元信號量簡稱信號量(Semaphore),對於容許多個線程併發訪問的資源,這是一個很好的選擇。一個初始值爲N的信號量容許N個線程併發訪問。線程訪問資源時首先獲取信號量鎖,進行以下操做:blog
1) 將信號量的值減1,進入運行狀態;
2) 若是信號量的值等於0,則進入等待狀態,不然繼續執行;
訪問資源結束以後,線程釋放信號量鎖,進行以下操做:
1) 將信號量的值加1,該線程繼續下一步執行;
2) 若是信號量的值大於1,喚醒一個等待中的線程;
3. 互斥量
互斥量(Mutex)和二元信號量相似,資源僅容許一個線程訪問。與二元信號量不一樣的是,信號量在整個系統中能夠被任意線程獲取和釋放,也就是說,同一個信號量能夠由一個線程獲取而由另外一線程釋放。而互斥量則要求哪一個線程獲取了該互斥量鎖就由哪一個線程釋放,其它線程越俎代庖釋放互斥量是無效的。
4. 臨界區
臨界區(Critical Section)是一種比互斥量更加嚴格的同步手段。互斥量和信號量在系統的任何進程都是可見的,也就是說一個進程建立了一個互斥量或信號量,另外一進程試圖獲取該鎖是合法的。而臨界區的做用範圍僅限於本進程,其它的進程沒法獲取該鎖。除此之處,臨界區與互斥量的性質相同。
5. 讀寫鎖
讀寫鎖(Read-Write Lock)容許多個線程同時對同一個數據進行讀操做,而只容許一個線程進行寫操做。這是由於讀操做不會改變數據的內容,是安全的;而寫操做會改變數據的內容,是不安全的。對同一個讀寫鎖,有兩種獲取方式:共享的(Shared)和獨佔的(Exclusive)。當鎖處於自由狀態時,試圖以任何一種方式獲取鎖都能成功,並將鎖置爲對應的狀態;若是鎖處於共享狀態,其它線程以共享方式獲取該鎖,仍然能成功,此時該鎖分配給了多個線程;若是其它線程試圖如獨佔的方式獲取處於共享狀態的鎖,它必須等待全部線程釋放該鎖;處於獨佔狀態的鎖阻止任何線程獲取該鎖,不論它們以何種方式。
定義:是指兩個或兩個以上的進程在執行過程當中,因爭奪資源而形成的一種互相等待的現象,若無外力做用,它們都將沒法推動下去。
造成死鎖的四個必要條件(缺一不可):
1.互斥條件:所謂互斥就是進程在某一時間內獨佔資源。
2.請求與保持條件:一個進程因請求資源而阻塞時,對已得到的資源保持不放。
3.不剝奪條件:進程已得到資源,在末使用完以前,不能強行剝奪。
4.循環等待條件:若干進程之間造成一種頭尾相接的循環等待資源關係。
1. 預防死鎖:經過應用程序的設計來破壞造成死鎖的必要條件
這是一種較簡單和直觀的事先預防的方法。方法是經過設置某些限制條件,去破壞產生死鎖的四個必要條件中的一個或者幾個,來預防發生死鎖。預防死鎖是一種較易實現的方法,已被普遍使用。可是因爲所施加的限制條件每每太嚴格,可能會致使系統資源利用率和系統吞吐量下降。
2. 避免死鎖:
該方法一樣是屬於事先預防的策略,但它並不須事先採起各類限制措施去破壞產生死鎖的的四個必要條件,而是在資源的動態分配過程當中,用某種方法去防止系統進入不安全狀態,從而避免發生死鎖。
3. 檢測和解除死鎖:
先檢測:這種方法並不須事先採起任何限制性措施,也沒必要檢查系統是否已經進入不安全區,此方法容許系統在運行過程當中發生死鎖。但可經過系統所設置的檢測機構,及時地檢測出死鎖的發生,並精確地肯定與死鎖有關的進程和資源。檢測方法包括定時檢測、效率低時檢測、進程等待時檢測等。而後解除死鎖:採起適當措施,從系統中將已發生的死鎖清除掉。這是與檢測死鎖相配套的一種措施。當檢測到系統中已發生死鎖時,須將進程從死鎖狀態中解脫出來。經常使用的實施方法是撤銷或掛起一些進程,以便回收一些資源,再將這些資源分配給已處於阻塞狀態的進程,使之轉爲就緒狀態,以繼續運行。死鎖的檢測和解除措施,有可能使系統得到較好的資源利用率和吞吐量,但在實現上難度也最大。