五 Linux下程序與執行緒的比較

2021-09-20 03:46:43 字數 2374 閱讀 8928

程序

執行緒描述

fork()

pthread_creat()

建立新的控制流

return/exit()/_exit()

return/pthread_exit()

從現有的控制流退出

wait()

pthread_join()

從控制流得出退出狀態

atexit()

pthread_clean_push()/pthread_clean_pop()

註冊在控制流退出的函式

getpid()

pthread_self()

獲取所在控制流id

abort()

pthread_cancle()

請求控制流非正常退出

對比維度

多程序多執行緒

總結資料共享、同步

資料共享複雜,需要用ipc;資料是分開的,同步簡單

因為共享程序資料,資料共享簡單,但也是因為這個原因導致同步複雜

各有優勢

記憶體、cpu

占用記憶體多,切換複雜,cpu利用率低

占用記憶體少,切換簡單,cpu利用率高

執行緒佔優

建立銷毀、切換

建立銷毀、切換複雜,速度慢

建立銷毀、切換簡單,速度很

執行緒佔優

程式設計、除錯

程式設計簡單,除錯簡單

程式設計複雜,除錯複雜

程序佔優

可靠性程序間不會互相影響

乙個執行緒掛掉將導致整個程序掛掉

程序佔優

分布式適應於多核、多機分布式;如果一台機器不夠,擴充套件到多台機器比較簡單

適應於多核分布式

程序佔優

1. 需要頻繁建立銷毀的優先用執行緒

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

2. 需要進行大量計算的優先使用執行緒

所謂大量計算,當然就是要耗費很多cpu,切換頻繁了,這種情況下執行緒是最合適的。這種原則最常見的是影象處理、演算法處理。

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

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

一般的server需要完成如下任務:訊息收發、訊息處理。「訊息收發」和「訊息處理」就是弱相關的任務,而「訊息處理」裡面可能又分為「訊息解碼」、「業務處理」,這兩個任務相對來說相關性就要強多了。因此「訊息收發」和「訊息處理」可以分程序設計,「訊息解碼」、「業務處理」可以分執行緒設計。當然這種劃分方式不是一成不變的,也可以根據實際情況進行調整。

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

原因請看上面對比。

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

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

狀態含義

就緒(ready)

執行緒能夠執行,但在等待可用的處理器。可能剛剛建立啟動,或剛剛從阻塞中恢復,或者被其他執行緒搶占

執行(running)

執行緒正在執行。在多處理器系統中,可能有多個執行緒處於執行態

阻塞(blocked)

執行緒由於等待處理器外的其他條件無法執行,如條件變數的改變、加鎖互斥量或i/o操作結束

終止(terminated)

執行緒從起始函式中返回,或者呼叫pthread_exit,或者被取消,終止自己並完成所有資源清理工作。不是被分離,也不是被連線

a.就緒:當執行緒剛被建立時就處於就緒狀態,或者當執行緒被解除阻塞以後也會處於就緒狀態。就緒的執行緒在等待乙個可用的處理器,當乙個執行的執行緒被搶占時,它立刻又回到就緒狀態。

b.執行:當處理器選中乙個就緒的執行緒執行時,它立刻變成執行狀態。

c.執行緒阻塞的原因可能是:

1. 試圖加鎖乙個已經被鎖住的互斥量

2. 等待某個條件變數

3. 呼叫singwait等待尚未發生的訊號

4. 執行無法立即完成的i/o操作

5. 執行緒還會由於如記憶體頁錯誤之類的系統操作而被阻塞

d.終止:執行緒通常啟動函式中返回來終止自己,或者呼叫pthread_exit退出,或者取消執行緒。

Linux程序與執行緒之五

每日一結 一 共享記憶體 核心空間預留出來的一塊記憶體,用於程序間通訊 1 int shmget key t key,size t size,int shm 功能 獲取共享記憶體段的id 引數 key ipc private 或 ftok size 申請的共享記憶體段大小 4k的倍數 shm ipc...

程序與執行緒的比較

程序 是資源分配的基本單位。所有與該程序有關的資源,都被記錄在程序控制塊pcb中。程序 處理機的排程單位,擁有完整的虛擬位址空間。當程序發生排程時,不同的程序擁有不同的虛擬位址空間,而同一程序內的不同執行緒共享同一位址空間。聯絡 1 執行緒與資源分配無關,屬於某乙個程序,並與其他執行緒共享程序資源。...

Linux下程序與執行緒的區別

程序是程式在計算機上的一次執行活動,即正在執行中的應用程式,通常稱為程序。當你執行乙個程式,你就啟動了乙個程序。每個程序都有自己獨立的位址空間 記憶體空間 每當使用者啟動乙個程序時,作業系統就會為該程序分配乙個獨立的記憶體空間,讓應用程式在這個獨立的記憶體空間中執行。程序一般由程式 資料集合和程序控...