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

2021-09-12 08:06:55 字數 1844 閱讀 1858

多程序的優點:

①程式設計相對容易;通常不需要考慮鎖和同步資源的問題。 

②更強的容錯性:比起多執行緒的乙個好處是乙個程序崩潰了不會影響其他程序。 

③有核心保證的隔離:資料和錯誤隔離。 對於使用如c/c++這些語言編寫的本地**,錯誤隔離是非常有用的:採用多程序架構的程式一般可以做到一定程度的自恢復;(master守護程序監控所有worker程序,發現程序掛掉後將其重啟)。

多執行緒的優點:

①建立速度快,方便高效的資料共享 

共享資料:多執行緒間可以共享同一虛擬位址空間;多程序間的資料共享就需要用到共享記憶體、訊號量等ipc技術。

②較輕的上下文切換開銷 - 不用切換位址空間,不用更改暫存器,不用重新整理tlb。 

③提供非均質的服務。如果全都是計算任務,但每個任務的耗時不都為1s,而是1ms-1s之間波動;這樣,多執行緒相比多程序的優勢就體現出來,它能有效降低「簡單任務被複雜任務壓住」的概率。

1. 多程序應用場景

nginx主流的工作模式是多程序模式(也支援多執行緒模型) 

幾乎所有的web server伺服器服務都有多程序的,至少有乙個守護程序配合乙個worker程序,例如apached,httpd等等以d結尾的程序包括init.d本身就是0級總程序,所有你認知的程序都是它的子程序; 

chrome瀏覽器也是多程序方式。 (原因:①可能存在一些網頁不符合程式設計規範,容易崩潰,採用多程序乙個網頁崩潰不會影響其他網頁;而採用多執行緒會。②網頁之間互相隔離,保證安全,不必擔心某個網頁中的惡意**會取得存放在其他網頁中的敏感資訊。)

redis也可以歸類到「多程序單執行緒」模型(平時工作是單個程序,涉及到耗時操作如持久化或aof重寫時會用到多個程序)

2. 多執行緒應用場景

執行緒間有資料共享,並且資料是需要修改的(不同任務間需要大量共享資料或頻繁通訊時)。

提供非均質的服務(有優先順序任務處理)事件響應有優先順序。

單任務平行計算,在非cpu bound的場景下提高響應速度,降低時延。 

與人有io互動的應用,良好的使用者體驗(鍵盤滑鼠的輸入,立刻響應)

案例:桌面軟體,響應使用者輸入的是乙個執行緒,後台程式處理是另外的執行緒; 

memcached

3. 選什麼?

①需要頻繁建立銷毀的優先用執行緒(程序的建立和銷毀開銷過大)

這種原則最常見的應用就是web伺服器了,來乙個連線建立乙個執行緒,斷了就銷毀執行緒,要是用程序,建立和銷毀的代價是很難承受的

②需要進行大量計算的優先使用執行緒(cpu頻繁切換)

所謂大量計算,當然就是要耗費很多cpu,切換頻繁了,這種情況下執行緒是最合適的。

這種原則最常見的是影象處理、演算法處理。

③強相關的處理用執行緒,弱相關的處理用程序

什麼叫強相關、弱相關?理論上很難定義,給個簡單的例子就明白了。

一般的server需要完成如下任務:訊息收發、訊息處理。「訊息收發」和「訊息處理」就是弱相關的任務,而「訊息處理」裡面可能又分為「訊息解碼」、「業務處理」,這兩個任務相對來說相關性就要強多了。因此「訊息收發」和「訊息處理」可以分程序設計,「訊息解碼」、「業務處理」可以分執行緒設計。

當然這種劃分方式不是一成不變的,也可以根據實際情況進行調整。

④可能要擴充套件到多機分布的用程序,多核分布的用執行緒

⑤都滿足需求的情況下,用你最熟悉、最拿手的方式

至於「資料共享、同步」、「程式設計、除錯」、「可靠性」這幾個維度的所謂的「複雜、簡單」應該怎麼取捨,我只能說:沒有明確的選擇方法。但我可以告訴你乙個選擇原則:如果多程序和多執行緒都能夠滿足要求,那麼選擇你最熟悉、最拿手的那個。

雖然我給了這麼多的選擇原則,但實際應用中基本上都是「程序+執行緒」的結合方式,千萬不要真的陷入一種非此即彼的誤區。

多程序和多執行緒

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

多執行緒和多程序

首先說什麼是程序,載入記憶體中執行的程式,它就是乙個程序,而這個程式中執行的某個子任務就是乙個執行緒,程式包含了執行緒。程序對於執行緒是唯一的,而乙個程序可以有多個執行緒。程式執行的時候每隔一定時間在多執行緒之間執行,比如第乙個執行緒執行到0.01秒,馬上暫停跳到下乙個執行緒開始執行,又執行到0.0...

多程序和多執行緒

一 python 中多程序的使用 1 使用multiprocessing p process target function,args 引數,p.start 含義啟動程序 p.join 含義是等待子程序結束後在繼續執行 2 如果啟動大量的子程序,可以用程序池的方式批量建立子程序 from multi...