1. 程式人生 > >併發,同步,非同步,互斥,阻塞,非阻塞的理解(重要)

併發,同步,非同步,互斥,阻塞,非阻塞的理解(重要)

  1. 併發(concurrency):在作業系統中,是指一個時間段中有幾個程式都處於已啟動執行到執行完畢之間,且這幾個程式都是在同一個處理機上執行。其中兩種併發關係分別是同步和互斥。

所謂互斥,是指分佈在不同程序之間的若干程式片斷,當某個程序執行其中一個程式片段時,其它程序就不能執行它們之中的任一程式片段,只能等到該程序執行完這個程式片段後才可以執行。 
所謂同步,是指分佈在不同程序之間的若干程式片斷,它們的執行必須嚴格按照規定的 某種先後次序來執行,這種先後次序依賴於要完成的特定的任務。 顯然,同步是一種更為複雜的互斥,而互斥是一種特殊的同步。也就是說互斥是兩個執行緒之間不可以同時執行,他們會相互排斥,必須等待一個執行緒執行完畢,另一個才能執行,而同步也是不能同時執行,但他是必須要安照某種次序來執行相應的執行緒(也是一種互斥)! 

總結: 
互斥:是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。   
同步:是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源。

  1. 非同步(asynchronous):非同步和同步是相對的,同步就是順序執行,執行完一個再執行下一個,需要等待、協調執行。非同步就是彼此獨立,在等待某事件的過程中繼續做自己的事,不需要等待這一事件完成後再工作。執行緒就是實現非同步的一個方式。非同步是讓呼叫方法的主執行緒不需要同步等待另一執行緒的完成,從而可以讓主執行緒幹其它的事情。 
    同步和非同步是針對應用程式和核心的互動而言的, 
    同步指的是使用者程序觸發IO操作並等待或者輪詢的去檢視IO操作是否就緒,而非同步是指使用者程序觸發IO操作以後便開始做自己的事情, 
    而當IO操作已經完成的時候會得到IO完成的通知(非同步的特點就是通知)。 
    非同步和多執行緒並不是一個同等關係,非同步是最終目的,多執行緒只是我們實現非同步的一種手段。非同步是當一個呼叫請求傳送給被呼叫者,而呼叫者不用等待其結果的返回而可以做其它的事情。實現非同步可以採用多執行緒技術或則交給另外的程序來處理。

3.阻塞,非阻塞 
而阻塞和非阻塞是針對於程序在訪問資料的時候,根據IO操作的就緒狀態來採取的不同方式,說白了是一種讀取或者寫入操作函式的實現方式,阻塞方式下讀取或者寫入函式將一直等待,而非阻塞方式下,讀取或者寫入函式會立即返回一個狀態值。 
一般來說IO模型可以分為:同步阻塞,同步非阻塞,非同步阻塞,非同步非阻塞。

同步阻塞IO 
在此種方式下,使用者程序在發起一個IO操作以後,必須等待IO操作的完成,只有當真正完成了IO操作以後,使用者程序才能執行。

同步非阻塞IO 
在此種方式下,使用者程序發起一個IO操作以後可返回做其它事情, 
但是使用者程序需要時不時的詢問IO操作是否就緒,這就要求使用者程序不停的去詢問,從而引入不必要的CPU資源浪費。

非同步阻塞IO 
此種方式下是指應用發起一個IO操作以後,不等待核心IO操作的完成, 
等核心完成IO操作以後會通知應用程式,這其實就是同步和非同步最關鍵的區別同步必須等待或者主動的去詢問IO是否完成,

非同步非阻塞IO 
在此種模式下,使用者程序只需要發起一個IO操作然後立即返回, 
等IO操作真正的完成以後,應用程式會得到IO操作完成的通知, 
此時使用者程序只需要對資料進行處理就好了,不需要進行實際的IO讀寫操作因為真正的IO讀取或者寫入操作已經由核心完成了。

同步與非同步是對應的,它們是執行緒之間的關係,兩個執行緒之間要麼是同步的,要麼是非同步的。 
阻塞與非阻塞是對同一個執行緒來說的,在某個時刻,執行緒要麼處於阻塞,要麼處於非阻塞。 
阻塞是使用同步機制的結果,非阻塞則是使用非同步機制的結果。