多程序和多執行緒的應用場景

2021-07-17 05:20:26 字數 1624 閱讀 9739

大cc的部落格

這裡的執行緒指通過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:

ref:

多程序和多執行緒的應用場景

關於多程序和多執行緒,教科書上最經典的一句話是 程序是資源分配的最小單位,執行緒是cpu排程的最小單位 這句話應付考試基本上夠了,但如果在工作中遇到類似的選擇問題,那就沒有這麼簡單了,選的不好,會讓你深受其害。經常在網路上看到有的xdjm問 多程序好還是多執行緒好?linux下用多程序還是多執行緒?...

Linux 多執行緒和多程序 及其應用場景

多程序的優點 程式設計相對容易 通常不需要考慮鎖和同步資源的問題。更強的容錯性 比起多執行緒的乙個好處是乙個程序崩潰了不會影響其他程序。有核心保證的隔離 資料和錯誤隔離。對於使用如c c 這些語言編寫的本地 錯誤隔離是非常有用的 採用多程序架構的程式一般可以做到一定程度的自恢復 master守護程序...

多執行緒和多程序的使用場景

較輕的上下文切換開銷,不用切換位址空間,不用更改暫存器,不用重新整理tlb。提供非均質的服務。如果全都是計算任務,但每個任務的耗時不都為1s,而是1ms 1s之間波動 這樣,多執行緒相比多程序的優勢就體現出來,它能有效降低 簡單任務被複雜任務壓住 的概率。nginx主流的工作模式是多程序模式 也支援...