進程與線程、同步與異步、阻塞與非阻塞、併發與並行

進程(Process) 與 線程(Thread)

  • 進程(Process):

進程是Windows系統中的一個基本概念,它包含着一個運行程序所須要的資源。一個正在運行的應用程序在操做系統中被視爲一個進程, 進程能夠包括一個或多個線程。 線程是操做系統分配處理器時間的基本單元,在進程中能夠有多個線程同時執行代碼。進程之間是相對獨立的,一個進程沒法訪問另外一個進程的數據(除非利用分佈式計算方式),一個進程運行的失敗也不會影響其餘進程的運行,Windows系統就是利用進程把工做劃分爲多個獨立的區域的。進程能夠理解爲一個程序的基本邊界。是應用程序的一個運行例程,是應用程序的一次動態執行過程多線程


  • 線程(Thread):

線程是進程中的基本執行單元,是操做系統分配CPU時間的基本單位, 一個進程能夠包含若干個線程, 在進程入口執行的第一個線程被視爲這個進程的主線程。在.NET應用程序中,都是以Main()方法做爲入口的,當調用此方法時系統就會自動建立一個主線程。線程主要是由CPU寄存器、調用棧和線程本地存儲器組成的。CPU寄存器主要記錄當前所執行線程的狀態,調用棧主要用於維護線程所調用到的內存與數據,TLS主要用於存放線程的狀態信息。併發


  • 進程(Process)與線程(Thread)的區別:異步

    • 進程和線程的主要差異在於它們是不一樣的操做系統資源管理方式。
    • 進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不一樣執行路徑。
    • 線程有本身的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,因此多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。
    • 對於一些要求同時進行而且又要共享某些變量的併發操做,只能用線程,不能用進程。
    • 一個程序至少有一個進程,一個進程至少有一個線程.
    • 線程的劃分尺度小於進程,使得多線程程序的併發性高。
    • 進程在執行過程當中擁有獨立的內存單元,而多個線程共享內存,從而極大地提升了程序的運行效率。
    • 線程在執行過程當中與進程仍是有區別的。每一個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。可是線程不可以獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
    • 從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分能夠同時執行。但操做系統並無將多個線程看作多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。


同步(Sync) 和 異步(Async)

  • 同步(Sync):

同步,就是發出一個功能調用時,在沒有獲得結果以前,該調用就不返回或繼續執行後續操做。簡單來講,同步就是必須一件一件事作,等前一件作完了才能作下一件事。分佈式


  • 異步(Async):

異步與同步相對,當一個異步過程調用發出後,調用者在沒有獲得結果以前,就能夠繼續執行後續操做。當這個調用完成後,通常經過狀態、通知和回調來通知調用者。對於異步調用,調用的返回並不受調用者控制。
通知調用者的三種方式:函數

  1. 狀態:
      即監聽被調用者的狀態(輪詢),調用者須要每隔必定時間檢查一次,效率會很低。
  2. 通知:
      當被調用者執行完成後,發出通知告知調用者,無需消耗太多性能。
  3. 回調:
      與通知相似,當被調用者執行完成後,會調用調用者提供的回調函數。

  • 同步(Sync)與異步(Async)的區別:  

簡單的說,就是請求發出後,是否須要等待結果,才能繼續執行其餘操做。性能



阻塞與非阻塞

  • 阻塞和非阻塞這兩個概念與程序(線程)等待消息通知(無所謂同步或者異步)時的狀態有關。也就是說阻塞與非阻塞主要是程序(線程)等待消息通知時的狀態角度來講的。
  • 阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態。
  • 阻塞調用是指調用結果返回以前,當前線程會被掛起。調用線程只有在獲得結果以後纔會返回。
  • 非阻塞調用指在不能馬上獲得結果以前,該調用不會阻塞當前線程。


併發 與 並行

  • 併發: 在操做系統中,是指一個時間段中有幾個程序都處於已啓動運行到運行完畢之間,且這幾個程序都是在同一個處理機上運行,但任一個時刻點上只有一個程序在處理機上運行。當有多個線程在操做時,若是系統只有一個CPU,則它根本不可能真正同時進行一個以上的線程,它只能把CPU運行時間劃分紅若干個時間段,再將時間 段分配給各個線程執行,在一個時間段的線程代碼運行時,其它線程處於掛起狀。.這種方式咱們稱之爲併發(Concurrent)。

  • 並行: 當系統有一個以上CPU時,則線程的操做有可能非併發。當一個CPU執行一個線程時,另外一個CPU能夠執行另外一個線程,兩個線程互不搶佔CPU資源,能夠同時進行,這種方式咱們稱之爲並行(Parallel)。

  • 併發 與 並行的區別:操作系統

    • 併發的關鍵是你有處理多個任務的能力, 不必定要同時進行。
    • 並行的關鍵是你有 同時 處理多個任務的能力。


理解 同步阻塞、同步非阻塞、異步阻塞、異步非阻塞線程

  • 同步/異步關注的是消息通知的機制,而阻塞/非阻塞關注的是程序(線程)等待消息通知時的狀態。

以小倩下載文件打個比方,從這兩個關注點來講明這兩組概念,但願可以更好的促進你們的理解。進程

同步阻塞: 小倩一直盯着下載進度條,到 100% 的時候就完成。
同步體如今: 等待下載完成通知;
阻塞體如今: 等待下載完成通知過程當中,不能作其餘任務處理;內存

同步非阻塞: 小倩提交下載任務後就去幹別的,每過一段時間就去瞄一眼進度條,看到 100% 就完成。
同步體如今: 等待下載完成通知,可是要必須在;
非阻塞體如今: 等待下載完成通知過程當中,去幹別的任務了,只是時不時會瞄一眼進度條;【小倩必需要在兩個任務間切換,關注下載進度】

異步阻塞: 小倩換了個有下載完成通知功能的軟件,下載完成就「叮」一聲。不太小倩仍然一直等待「叮」的聲音(看起來很傻,不是嗎?)。
異步體如今: 下載完成「叮」一聲通知;
阻塞體如今: 等待下載完成「叮」一聲通知過程當中,不能作其餘任務處理;

異步非阻塞: 仍然是那個會「叮」一聲的下載軟件,小倩提交下載任務後就去幹別的,聽到「叮」的一聲就知道完成了。
異步體如今: 下載完成「叮」一聲通知;
非阻塞體如今: 等待下載完成「叮」一聲通知過程當中,去幹別的任務了,只須要接收「叮」聲通知便可;【軟件處理下載任務,小倩處理其餘任務,不需關注進度,只需接收軟件「叮」聲通知,便可】

也就是說,同步/異步是「下載完成消息」通知的方式(機制),而阻塞/非阻塞則是在等待「下載完成消息」通知過程當中的狀態(能不能幹其餘任務),在不一樣的場景下,同步/異步、阻塞/非阻塞的四種組合都有應用。


因此,綜上所述,同步和異步僅僅是關注的消息如何通知的機制,而阻塞與非阻塞關注的是等待消息通知時的狀態。也就是說,同步的狀況下,是由處理消息者本身去等待消息是否被觸發,而異步的狀況下是由觸發機制來通知處理消息者,因此在異步機制中,處理消息者和觸發機制之間就須要一個鏈接的橋樑:在小倩的例子中,這個橋樑就是軟件「叮」的聲音。

同步/異步 與 阻塞/非阻塞

  1. 同步阻塞形式
      效率是最低的

  2. 異步阻塞形式
      異步操做是能夠被阻塞住的,只不過它不是在處理消息時阻塞,而是在等待消息通知時被阻塞。

  3. 同步阻塞形式
     其實是效率低下的,(想象一下你一邊幹別的事情一邊還須要擡頭看下載完成沒有)

  4. 異步非阻塞形式
      效率更高


^_<

相關文章
相關標籤/搜索