多執行緒和多程式模型的選用
這裡的執行緒指通過linux的pthread_create而產生的原生執行緒,執行緒資源很寶貴,能被作業系統的任務排程器看見的(不是python gevent、go gorouine裡的概念);
我們討論以下兩種模型;
- 多程式單執行緒模型(以下簡稱為多程式);
- 單程式多執行緒模型(以下簡稱為多執行緒);
多程式模型
優點
程式設計相對容易;通常不需要考慮鎖和同步資源的問題。
更強的容錯性:比起多執行緒的一個好處是一個程式崩潰了不會影響其他程式。
有核心保證的隔離:資料和錯誤隔離。
對於使用如C/C++這些語言編寫的原生程式碼,錯誤隔離是非常有用的:採用多程式架構的程式一般可以做到一定程度的自恢復;(master守護程式監控所有worker程式,發現程式掛掉後將其重啟)
多程式的案例
nginx主流的工作模式是多程式模式(也支援多執行緒模型)
幾乎所有的web server伺服器服務都有多程式的,至少有一個守護程式配合一個worker程式,例如apached,httpd等等以d結尾的程式包括init.d本身就是0級總程式,所有你認知的程式都是它的子程式;
chrome瀏覽器也是多程式方式。
redis也可以歸類到“多程式單執行緒”模型(平時工作是單個程式,涉及到耗時操作如持久化或aof重寫時會用到多個程式)
多執行緒模型
優點
多執行緒優點:建立速度快,方便高效的資料共享
共享資料:多執行緒間可以共享同一虛擬地址空間;多程式間的資料共享就需要用到共享記憶體、訊號量等IPC技術;
較輕的上下文切換開銷 - 不用切換地址空間,不用更改暫存器,不用重新整理TLB。
提供非均質的服務
如果全都是計算任務,但每個任務的耗時不都為1s,而是1ms-1s之間波動;這樣,多執行緒相比多程式的優勢就體現出來,它能有效降低“簡單任務被複雜任務壓住”的概率;
適用的場景
1 執行緒間有資料共享,並且資料是需要修改的(不同任務間需要大量共享資料或頻繁通訊時);
2 提供非均質的服務(有優先順序任務處理)事件響應有優先順序;
3 單任務平行計算,在非CPU Bound的場景下提高響應速度,降低時延;
4 與人有IO互動的應用,良好的使用者體驗(鍵盤滑鼠的輸入,立刻響應)
多執行緒案例
桌面軟體,響應使用者輸入的是一個執行緒,後臺程式處理是另外的執行緒;
memcached
選用
單程式多執行緒和多程式單執行緒,2種模式如何取捨?
程式執行緒間建立的開銷不足作為選擇的依據,因為一般我們都是使用執行緒池或者程式池,在系統啟動時就建立了固定的執行緒或程式,不會頻繁的建立和銷燬;
首先,根據工作集(需要共享的記憶體)的大小來定;如果工作集較大,就用多執行緒,避免cpu cache頻繁的換入換出;比如memcached快取系統;
其次,選擇的依據根據以上多執行緒適用的場景來對比自身的業務場景,是否有這樣場景需求:資料共享、提供非均質的服務,單任務拆散並行化等;
如果沒有必要,或者多程式就可以很好的勝任,就多用多程式,享受單執行緒程式設計帶來便利;
RCU的發明者,Paul McKenny 在《Is Parallel Programming Hard, And, If So, What Can You Do About It?》說過:
能用多程式方便的解決問題的時候不要使用多執行緒。
參考
ref:《Linux多執行緒服務端程式設計:使用muduo網路庫》
ref:http://www.zhihu.com/question/19903801
ref:https://computing.llnl.gov/tutorials/pthreads/#WhyPthreads
Posted by: 大CC | 10OCT,2015
部落格:blog.me115.com [訂閱]
Github:大CC