程序與執行緒區別以及應用場景

2021-09-24 16:52:22 字數 2043 閱讀 3747

一. 兩者區別

程序是分配資源的基本單位;執行緒是系統排程和分派的基本單位。

屬於同一程序的執行緒,堆是共享的,棧是私有的。

屬於同一程序的所有執行緒都具有相同的位址空間。

多程序的優點:

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

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

③有核心保證的隔離:資料和錯誤隔離。 對於使用如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需要完成如下任務:訊息收發、訊息處理。「訊息收發」和「訊息處理」就是弱相關的任務,而「訊息處理」裡面可能又分為「訊息解碼」、「業務處理」,這兩個任務相對來說相關性就要強多了。因此「訊息收發」和「訊息處理」可以分程序設計,「訊息解碼」、「業務處理」可以分執行緒設計。

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

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

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

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

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

原文:

執行緒與程序應用場景

1.計算密集型下程序與執行緒對比 import time,os from multiprocessing import process from threading import thread 計算密集型 def work res 0 for i in range 100000 res i if n...

程序執行緒優缺點和應用場景

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

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

大cc的部落格 這裡的執行緒指通過linux的pthread create而產生的原生執行緒,執行緒資源很寶貴,能被作業系統的任務排程器看見的 不是python gevent go gorouine裡的概念 我們討論以下兩種模型 多程序單執行緒模型 以下簡稱為多程序 單程序多執行緒模型 以下簡稱為多...