經典定義:一個執行中程序的實例。系統中的每一個程序都運行在某個進程的上下文中。(-摘自 CSAPP)html
進程是系統資源分配的最小單位python
線程就是運行在進程上下文中的邏輯流。golang
線程是操做系統可以進行運算調度的最小單位。服務器
相對子例程而言,協程更爲通常和靈活,但在實踐中使用沒有子例程那樣普遍。併發
根據維基百科對子例程的描述:是一個大型程序中的某部分代碼,由一個或多個語句塊組成。它負責完成某項特定任務,並且相較於其餘代碼,具有相對的獨立性。我能夠將子例程理解爲一個函數。函數
首先,進程提供給應用程序的關鍵抽象爲:高併發
從以上描述我能夠看出,一個進程是一個獨立進行的任務,它佔用的系統資源有:地址空間,全局變量,文件描述符,硬件資源等。性能
進程出現的目的,是爲了更好的利用CPU資源。例如:lua
假設有兩個任務A和B,當A遇到IO操做,CPU默默的等待任務A讀取完操做再去執行任務B,這樣無疑是對CPU資源的極大的浪費。若在任務A讀取數據時,讓任務B執行,當任務A讀取完數據後,再切換到任務A執行,這樣就能夠更好地利用CPU資源。這裏的切換涉及到狀態的保存,狀態的恢復,須要有一個東西去記錄任務A和任務B分別須要什麼資源,怎樣去識別任務A和任務B,這時進程就出現了。操作系統
所以,經過進程來分配系統資源,標識任務。
如何分配CPU去執行進程稱之爲調度,進程狀態的記錄,恢復,上下文切換(簡稱切換)。
其次,若上面說起的任務A是一個文本程序,須要接受鍵盤輸入,將內容顯示在屏幕上,還須要保存信息到硬盤中。
核心只有一個, 線程是操做系統調度,協程是用戶態調度。
協程沒必要須是語言集成,例如C語言能夠用setjmp/longjmp實現,也能夠本身經過改變esp指針換棧實現協程。協程自己跟高吞吐沒任何關係,基於io多路複用+回調就能夠實現高併發和高吞吐。 引入協程是爲了將回調邏輯變成線性同步邏輯。