進程是Windows系統中的一個基本概念,它包含着一個運行程序所須要的資源。一個正在運行的應用程序在操做系統中被視爲一個進程, 進程能夠包括一個或多個線程。 線程是操做系統分配處理器時間的基本單元,在進程中能夠有多個線程同時執行代碼。進程之間是相對獨立的,一個進程沒法訪問另外一個進程的數據(除非利用分佈式計算方式),一個進程運行的失敗也不會影響其餘進程的運行,Windows系統就是利用進程把工做劃分爲多個獨立的區域的。進程能夠理解爲一個程序的基本邊界。是應用程序的一個運行例程,是應用程序的一次動態執行過程多線程
線程是進程中的基本執行單元,是操做系統分配CPU時間的基本單位, 一個進程能夠包含若干個線程, 在進程入口執行的第一個線程被視爲這個進程的主線程。在.NET應用程序中,都是以Main()方法做爲入口的,當調用此方法時系統就會自動建立一個主線程。線程主要是由CPU寄存器、調用棧和線程本地存儲器組成的。CPU寄存器主要記錄當前所執行線程的狀態,調用棧主要用於維護線程所調用到的內存與數據,TLS主要用於存放線程的狀態信息。併發
進程(Process)與線程(Thread)的區別:異步
同步,就是發出一個功能調用時,在沒有獲得結果以前,該調用就不返回或繼續執行後續操做。簡單來講,同步就是必須一件一件事作,等前一件作完了才能作下一件事。分佈式
異步與同步相對,當一個異步過程調用發出後,調用者在沒有獲得結果以前,就能夠繼續執行後續操做。當這個調用完成後,通常經過狀態、通知和回調來通知調用者。對於異步調用,調用的返回並不受調用者控制。
通知調用者的三種方式:函數
- 狀態:
即監聽被調用者的狀態(輪詢),調用者須要每隔必定時間檢查一次,效率會很低。- 通知:
當被調用者執行完成後,發出通知告知調用者,無需消耗太多性能。- 回調:
與通知相似,當被調用者執行完成後,會調用調用者提供的回調函數。
簡單的說,就是請求發出後,是否須要等待結果,才能繼續執行其餘操做。性能
併發 與 並行的區別:操作系統
理解 同步阻塞、同步非阻塞、異步阻塞、異步非阻塞線程
- 同步/異步關注的是消息通知的機制,而阻塞/非阻塞關注的是程序(線程)等待消息通知時的狀態。
以小倩下載文件打個比方,從這兩個關注點來講明這兩組概念,但願可以更好的促進你們的理解。進程
同步阻塞: 小倩一直盯着下載進度條,到 100% 的時候就完成。
同步體如今: 等待下載完成通知;
阻塞體如今: 等待下載完成通知過程當中,不能作其餘任務處理;內存同步非阻塞: 小倩提交下載任務後就去幹別的,每過一段時間就去瞄一眼進度條,看到 100% 就完成。
同步體如今: 等待下載完成通知,可是要必須在;
非阻塞體如今: 等待下載完成通知過程當中,去幹別的任務了,只是時不時會瞄一眼進度條;【小倩必需要在兩個任務間切換,關注下載進度】異步阻塞: 小倩換了個有下載完成通知功能的軟件,下載完成就「叮」一聲。不太小倩仍然一直等待「叮」的聲音(看起來很傻,不是嗎?)。
異步體如今: 下載完成「叮」一聲通知;
阻塞體如今: 等待下載完成「叮」一聲通知過程當中,不能作其餘任務處理;異步非阻塞: 仍然是那個會「叮」一聲的下載軟件,小倩提交下載任務後就去幹別的,聽到「叮」的一聲就知道完成了。
異步體如今: 下載完成「叮」一聲通知;
非阻塞體如今: 等待下載完成「叮」一聲通知過程當中,去幹別的任務了,只須要接收「叮」聲通知便可;【軟件處理下載任務,小倩處理其餘任務,不需關注進度,只需接收軟件「叮」聲通知,便可】也就是說,同步/異步是「下載完成消息」通知的方式(機制),而阻塞/非阻塞則是在等待「下載完成消息」通知過程當中的狀態(能不能幹其餘任務),在不一樣的場景下,同步/異步、阻塞/非阻塞的四種組合都有應用。
因此,綜上所述,同步和異步僅僅是關注的消息如何通知的機制,而阻塞與非阻塞關注的是等待消息通知時的狀態。也就是說,同步的狀況下,是由處理消息者本身去等待消息是否被觸發,而異步的狀況下是由觸發機制來通知處理消息者,因此在異步機制中,處理消息者和觸發機制之間就須要一個鏈接的橋樑:在小倩的例子中,這個橋樑就是軟件「叮」的聲音。
同步/異步 與 阻塞/非阻塞
同步阻塞形式
效率是最低的異步阻塞形式
異步操做是能夠被阻塞住的,只不過它不是在處理消息時阻塞,而是在等待消息通知時被阻塞。同步阻塞形式
其實是效率低下的,(想象一下你一邊幹別的事情一邊還須要擡頭看下載完成沒有)異步非阻塞形式
效率更高