多線程和多程序模型的選用
這裡的線程指通過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