多進程 VS 多線程 VS 線程池 VS EventLoop

多進程 VS 多線程 VS 線程池 VS EventLoop

在如今的編程過程當中,常常聽到多進程,多線程,線程池,EventLoop 的概念,選擇一個正確的驅動模型,有助於提高代碼的性能。html

注:本文僅僅討論併發的狀況。linux

進程和線程

  • 進程:操做系統中資源管理對象,管理虛擬內存,文件句柄,線程等資源,可是進程不是執行單元編程

  • 線程:具體的執行單元。CPU是實際的物理執行單元,經過寄存器能夠控制CPU執行的代碼以及狀態。而線程就是包含了一個任務的CPU上下文(寄存器),任務狀態(就緒|阻塞|運行),所屬用戶等信息的對象。操做系統接收到時間中斷(INT)後,經過輪轉線程中的CPU上下文(寄存器)信息,實現了多任務的輪轉服務器

多進程

多進程:針對併發請求,一個請求開啓一個進程進行處理。早起CGI就是這麼幹的。網絡

表明:早期PHP,CGI類多線程

優勢:併發

  • 一個業務進程奔潰不影響另一個業務進程,從操做系統層面上隔離業務執行
  • 若是進程採用Socket之類的RPC調用,那麼很是容易部署到網絡環境上

缺點:oop

  • RPC調用比較難以編寫
  • 頻繁的開啓和關閉進程,性能比較差
  • 不容許內存共享(排除內核支持狀況)

多線程

多線程:針對不一樣的業務邏輯,併發的開啓多個線程進行執行。性能

表明:早期 Tomcat Bio模型操作系統

優勢:

  • 內存是共享的
  • 編寫併發模型比較方便
  • 有效的利用多核CPU

缺點:

  • 併發量過大的時候,開啓了太多線程(有些阻塞在IO),致使CPU上下文切換太過頻繁
  • 過多的線程,會佔用許多內存(2MB/Thread),形成服務器奔潰
  • 須要作併發控制

線程池

線程池:開啓固定的線程,當有請求過來的時候,查詢是否存在空閒線程,若是存在,則使用空閒線程執行任務,不然加入等待執行隊列

表明:Netty,Jetty

優勢:

  • 有效的利用多核CPU
  • 內存共享
  • 減小了CPU上下文切換消耗

缺點:

  • 仍是存在一部分IO等待,致使CPU沒法有效的利用
  • 須要作併發控制

EventLoop

EventLoop:僅僅開啓一條main線程執行任務,其餘全部的IO操做等,都放在後臺線程中執行,對於新的請求,都加入到queue中,等待main線程調度。

表明:Node.js

優勢:

  • 大部分狀況下,不須要作併發控制
  • 減小了CPU上下文切換消耗

缺點:

  • 沒法有效利用多核CPU(固然能夠多開EventLoop)
  • 回調陷進,調試比較困難

總結

上述的各類編程模型,都出如今咱們的實際的開發過程當中,其核心思想爲:有效的利用CPU,減小阻塞等待和非業務代碼(如上下文切換)的運行時間佔用。

參考

相關文章
相關標籤/搜索