執行緒與程序的區別與優缺點
[1]程序
1.每建立一個程序,核心都會給這個程序分配資源(記憶體.cpu...)。
2.程序是系統分配資源的最小單位。
3.程序之間,彼此的地址空間是獨立的(每個程序都有自己獨立的虛擬地址空間)
[2]執行緒
1.同一個程序的多個執行緒共享一份全域性記憶體區域(多個執行緒同屬於同一個程序)
2.執行緒是系統排程的最小單位
3.執行緒是輕量級的程序(因為每個執行緒都存在一個程序描述符task_struct)
[3]執行緒和程序的關係
[4]為什麼需要多執行緒
1.好比去銀行辦理業務,你一定希望,辦理業務的視窗越多越好。如果把整個營業大廳當成一個程序的話,那麼每一個視窗就是一個工作執行緒。
2.Master-worker併發模型
--------------------------------------------------------------------------------
Master執行緒→建立執行緒 [請求] [請求] [請求]... // 排隊等待區
↓
worker執行緒 [請求]
↓
worker執行緒 [請求]
↓
worker執行緒 [請求]
--------------------------------------------------------------------------------
[5]多執行緒共享資源帶來的優勢
1.建立執行緒花費的時間要少於建立程序。
2.終止執行緒花費的時間要少於終止程序。
3.執行緒之間上下文切換的開銷,要小於程序之間的上下文切換 。// 上下文: 不同執行緒/程序之間
4.執行緒之間資料的共享比程序之間的共享要簡單。
5.執行緒之間通訊的代價低於程序之間通訊的代價。 //部門內的協作總是要比跨部門的協作來得順溜
6.發揮多核優勢,充分利用CPU資源 // 單程序的排隊模式可能導致CPU資源浪費,而任務還不能快速處理
7.更自然的程式設計模型:將工作切分成多個模組,併為每個模組分配一個或多個執行單元。
[6]多執行緒的缺點
1.要有一個執行緒不夠健壯存在bug,就會導致程序內的所有執行緒一起完蛋。
2.執行緒模型作為一種併發的程式設計模型,效率並沒有想象的那麼高,會出現複雜度高、易出錯、難以測試和定位的問題
3.多個執行緒之間需要同步:
·比如: 一個公寓,當你朋友正在使用衛生間的時候,你就無法使用了。
·若存在多個執行緒操作共享資源,則需要同步,否則可能會出現結果錯誤、資料結構遭到破壞甚至是程式崩潰等後果。
·因此多執行緒程式設計中存在臨界區的概念,臨界區的程式碼只允許一個執行緒執行,執行緒提供了鎖機制來保護臨界區。
·當其他執行緒來到臨界區卻無法申請到鎖時,就可能陷入阻塞,不再處於可執行狀態,執行緒可能不得不讓出 CPU 資源。
4.多執行緒的四大陷阱
· 死鎖(Dead Lock)
· 餓死(Starvation)
· 活鎖(Live Lock)
· 競態條件(Race Condition)
[7]總結
多程序屬於立體交通系統,雖然造價高,上坡下坡比較耗油,但是堵車少;
多執行緒屬於平面交通系統,造價低,但是紅綠燈太多,老堵車。
立體: 程序間地址空間互相獨立
造價高: fork後copy父程序資源
耗油: 通行前建立: 管道.FIFO.共享記憶體.訊息佇列.訊號量
堵車少: 通訊順暢, 不受其他程序影響
平面: 多個執行緒共享該程序所有資源
造價低: 不用去拷貝資源, 僅共享
燈太多: 各種鎖, 訪問控制
老堵車: 多個資源搶奪鎖去訪問臨界資源, 難獲得鎖。