在如今的編程過程當中,常常聽到多進程,多線程,線程池,EventLoop 的概念,選擇一個正確的驅動模型,有助於提高代碼的性能。html
注:本文僅僅討論併發的狀況。linux
進程:操做系統中資源管理對象,管理虛擬內存,文件句柄,線程等資源,可是進程不是執行單元。編程
線程:具體的執行單元。CPU是實際的物理執行單元,經過寄存器能夠控制CPU執行的代碼以及狀態。而線程就是包含了一個任務的CPU上下文(寄存器),任務狀態(就緒|阻塞|運行),所屬用戶等信息的對象。操做系統接收到時間中斷(INT)後,經過輪轉線程中的CPU上下文(寄存器)信息,實現了多任務的輪轉。服務器
多進程:針對併發請求,一個請求開啓一個進程進行處理。早起CGI就是這麼幹的。網絡
表明:早期PHP,CGI類多線程
優勢:併發
缺點:oop
多線程:針對不一樣的業務邏輯,併發的開啓多個線程進行執行。性能
表明:早期 Tomcat Bio模型操作系統
優勢:
缺點:
線程池:開啓固定的線程,當有請求過來的時候,查詢是否存在空閒線程,若是存在,則使用空閒線程執行任務,不然加入等待執行隊列
表明:Netty,Jetty
優勢:
缺點:
EventLoop:僅僅開啓一條main線程執行任務,其餘全部的IO操做等,都放在後臺線程中執行,對於新的請求,都加入到queue中,等待main線程調度。
表明:Node.js
優勢:
缺點:
上述的各類編程模型,都出如今咱們的實際的開發過程當中,其核心思想爲:有效的利用CPU,減小阻塞等待和非業務代碼(如上下文切換)的運行時間佔用。