要成為一名優秀的軟體工程師,流程和執行緒是必須了解和掌握的知識點,不僅因為它們是電腦科學的基礎知識,還因為知道如何在正確的時間使用它們可以提高程式的執行效率,即提高效能。
在了解程序和執行緒之前,我們先來談談程式,其實所謂的程式就是工程師編寫的**集合,程式經過編譯器或直譯器的處理,轉換成機器可以理解和執行的形式。
程序是執行並載入到記憶體中的程式。 程序也是作業系統分配的最小資源單位,可以從作業系統中獲取,如CPU時間、記憶體等依此類推,這意味著程序在執行時消耗了多少 CPU 和記憶體。 下面是 macOS Activity Monitor 的截圖,相信使用不管是哪個作業系統的讀者都見過類似的介面,並且監視器列出了你電腦正在執行的應用程式,它們實際上是程序,你可以看到每個程序消耗的 CPU、CPU 時間和每個程序的獨立 ID(PID)。
優點:每個程序都有自己獨立的系統資源分配空間,不同程序之間不共享資源,因此無需對程序進行互斥操作。 缺點:建立流程和切換流程的上下文更耗費資源,並且流程之間的通訊需求更複雜。 總結:乙個程式已經寫好了,但還沒有執行,程式執行完後就變成了乙個程序。
執行緒可以想象存在於程序中,乙個程序中至少會有乙個執行緒,前面說程序是作業系統分配的最小資源單位,執行緒是作業系統可以排程的最小單位,也就是說,實際執行任務的不是程序, 但是程序中的執行緒,乙個程序可以有多個執行緒,其中多個執行緒可以共享程序的系統資源,並且該程序可以比作乙個工廠。執行緒是工廠中負責實際執行任務的工人。
我認為,如果我們繼續使用工廠和工人的比喻,這兩個概念會更容易理解和記憶。
多處理就像設定許多工廠(通常是 CPU 的數量),每個工廠都有同時完成更多事情的優勢。
另一方面,多執行緒將許多員工聚集在同乙個工廠,其優點是有機會在相對較短的時間內完成相同的工作。
如前所述,在多執行緒中,不同的執行緒可以共享資源,如果兩個執行緒同時訪問或更改全域性變數,則可能會出現同步問題。 在執行過程中爭用資源時可能會發生死鎖,因此在使用多執行緒時必須特別小心以避免這些情況。
並行並行是利用多個CPU來實現對並行處理任務的需求(即多個任務同時執行),併發是多個任務在爭奪同乙個CPU的資源,所以在乙個時間點只會執行乙個任務, 僅僅因為切換速度非常快,使用者通常不會覺得任務實際上是在切換。
協程是乙個使用者模式的輕量級執行執行緒,協程的排程完全由使用者控制。
想想程序中的執行緒,以及執行緒中的協程。 協程的排程完全由使用者控制協程還將有自己的暫存器、上下文、堆疊等,協程的排程器控制當前執行的協程以及要阻止的協程。 如果協程卡住了,它會直接在使用者端將另乙個協程切換到這個執行緒繼續執行,這樣其他協程就不會被阻塞,從而可以有效利用資源,從而實現併發的概念。
相較於構建執行緒需要花費MB的記憶體,建立協程可以壓到kB級,協程之間的切換絕對比執行緒之間的切換要快。
通過本文,我們已經談到了程序、執行緒和協程的概念,但實際上,在使用多程序、多執行緒開發時需要考慮的因素很多,如果你不小心,可能會導致上面提到的race condition
或者效能不公升反降,所以在實踐中還是要仔細考慮和驗證的。