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