1. 程式人生 > >執行緒與程序的區別與優缺點

執行緒與程序的區別與優缺點

    [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.共享記憶體.訊息佇列.訊號量
            堵車少: 通訊順暢, 不受其他程序影響
            平面:   多個執行緒共享該程序所有資源
            造價低: 不用去拷貝資源, 僅共享
            燈太多: 各種鎖, 訪問控制
            老堵車: 多個資源搶奪鎖去訪問臨界資源, 難獲得鎖。