關於併發/並行,阻塞/非阻塞,同步/非同步及程序/執行緒的理解
1. 阻塞,非阻塞
一個執行緒/程序經歷的5個狀態,建立,就緒,執行,阻塞,終止。各個狀態的轉換條件如上圖,其中有個阻塞狀態,就是說當執行緒中呼叫某個函式,需要IO請求,或者暫時得不到競爭資源的,作業系統會把該執行緒阻塞起來,避免浪費CPU資源,等到得到了資源,再變成就緒狀態,等待CPU排程執行。
阻塞呼叫是指呼叫結果返回之前,呼叫者會進入阻塞狀態等待。只有在得到結果之後才會返回。
非阻塞呼叫是指在不能立刻得到結果之前,該函式不會阻塞當前執行緒,而會立刻返回。
2. 併發,並行
1,併發是指一個時間段內,有幾個程式都在同一個CPU上執行,但任意一個時刻點上只有一個程式在處理機上執行。CPU在多個程式之間快速切換,微觀上不是同時執行,任意一個時刻只有一個程式在執行,但巨集觀上看起來就像多個程式同時執行一樣,因為CPU切換速度非常快。
CPU排程策略(併發)
1 先來先服務 - 時間片輪轉排程,缺點是有些緊急的任務要很久才能得到執行。
2 優先順序排程
3 最短作業優先
4 最高響應比優先,用執行緒的等待時間除以服務時間,得到響應比
5 多級反饋佇列排程
兩種併發關係:
互斥:程序間相互排斥的使用臨界資源的現象,就叫互斥。
同步(synchronous):程序之間的關係不是相互排斥臨界資源的關係,而是相互依賴的關係。進一步的說明:就是前一個程序的輸出作為後一個程序的輸入,當第一個程序沒有輸出時第二個程序必須等待。具有同步關係的一組併發程序相互發送的資訊稱為訊息或事件。
2,並行是指一個時間段內,有幾個程式都在幾個CPU上執行,任意一個時刻點上,有多個程式在同時執行,並且多道程式之間互不干擾。
3. 同步和非同步
同步:在發出一個同步呼叫時,在沒有得到結果之前,該呼叫就不返回。同步就是順序執行,執行完一個再執行下一個,需要等待、協調執行。
非同步:在發出一個非同步呼叫後,呼叫者不會立刻得到結果,該呼叫就返回了。非同步就是彼此獨立,在等待某事件的過程中繼續做自己的事,不需要等待這一事件完成後再工作。執行緒就是實現非同步的一個方式。非同步是讓呼叫方法的主執行緒不需要同步等待另一執行緒的完成,從而可以讓主執行緒幹其它的事情。(多執行緒只是我們實現非同步的一種手段)
4.程序和執行緒
程序(Process):包含著一個執行程式所需要的資源。一個正在執行的應用程式在作業系統中被視為一個程序,程序可以包括一個或多個執行緒。
程序之間是相對獨立的,一個程序無法訪問另一個程序的資料(除非利用分散式計算方式),一個程序執行的失敗也不會影響其他程序的執行,Windows系統就是利用程序把工作劃分為多個獨立的區域的。
執行緒(Thread):執行緒是作業系統分配處理器時間的基本單元,是程序中的基本執行單元。
在程序入口執行的第一個執行緒被視為這個程序的主執行緒。執行緒主要是由CPU暫存器、呼叫棧和執行緒本地儲存器(Thread Local Storage,TLS)組成的。CPU暫存器主要記錄當前所執行執行緒的狀態,呼叫棧主要用於維護執行緒所呼叫到的記憶體與資料,TLS主要用於存放執行緒的狀態資訊。
程序和執行緒的區別
程序和執行緒的主要差別在於它們是不同的作業系統資源管理方式。程序有獨立的地址空間,一個程序崩潰後,在保護模式下不會對其它程序產生影響,而執行緒只是一個程序中的不同執行路徑。執行緒有自己的堆疊和區域性變數,但執行緒之間沒有單獨的地址空間,一個執行緒死掉就等於整個程序死掉,所以多程序的程式要比多執行緒的程式健壯,但在程序切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變數的併發操作,只能用執行緒,不能用程序。
總結:
同步與非同步是對應的,它們是執行緒之間的關係,兩個執行緒之間要麼是同步的,要麼是非同步的。
阻塞與非阻塞是對同一個執行緒來說的,在某個時刻,執行緒要麼處於阻塞,要麼處於非阻塞。
阻塞是使用同步機制的結果,非阻塞則是使用非同步機制的結果。
轉載自:https://blog.csdn.net/sinat_35512245/article/details/53836580