多線程和多進程模型的選用


多線程和多進程模型的選用

這里的線程指通過linux的pthread_create而產生的原生線程,線程資源很寶貴,能被操作系統的任務調度器看見的(不是python gevent、go gorouine里的概念);
我們討論以下兩種模型;

  1. 多進程單線程模型(以下簡稱為多進程);
  2. 單進程多線程模型(以下簡稱為多線程);

多進程模型

優點

編程相對容易;通常不需要考慮鎖和同步資源的問題。
更強的容錯性:比起多線程的一個好處是一個進程崩潰了不會影響其他進程。
有內核保證的隔離:數據和錯誤隔離。
對於使用如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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM