如何理解單執行緒、多執行緒?如何選擇多執行緒、多程序?
在進入主題之前,我們先要理解一些名詞。
- 程序
- 執行緒
- 主程序
- 子程序
- 主執行緒
- 子執行緒
名詞理解
- 程序
當一個程式被執行,作業系統就會為這個程式生成一個程序,以管理該程式執行過程中記憶體和系統資源的分配。
程序是程式被執行時,作業系統的管理單元,並且,程序也是作業系統分配資源的最小單元。
- 執行緒
執行緒是比程序更小的單元,它是cpu的最小執行單元(當然,現在還有協程)。一個程序,至少包含一個或多個執行緒。
- 主程序和子程序
程式執行之後,有些複雜的任務一個程序是無法完成的,這時候就有了多程序的概念。多程序中,便有了主程序和子程序。
主程序是程式執行的中樞,它負責統籌安排。
而子程序則通常負責具體的事務。
比如php-fpm的設計,它就有一個主程序,當fpm被執行的時候,會有一條主程序長時間執行,而當有具體的請求到達伺服器時,主程序會開啟一些子程序去專門處理請求。
- 主執行緒和子執行緒
同樣,既然一個程序能夠被拆分成多個執行緒,那麼,執行緒也是有主次之分的。
比如,一個程序,初始化的時候,通常是一個執行緒在執行的,而當需要處理一些耗時長的任務時(比如IO操作),就會讓開啟一條子執行緒,讓子執行緒去做這個事情,然後主執行緒繼續執行接下去的任務。
這便是多執行緒。
單執行緒和多執行緒
單執行緒的程序,有一個特性就是順序執行,當遇到比較耗時的任務時,還未執行的任務就會處於等待狀態,一定要等到前面的任務完成了,才會往後執行。
PHP就是典型的單執行緒,它一定是順序執行的,前面不執行完,後面執行不了
當然,swoole除外
多執行緒在軟體層面,可以說是多個執行緒同時執行,但在物理層面,cpu如果是單核,那多個執行緒之間就總得有個先後(這涉及到cpu的執行緒排程、時間片輪轉知識)
多執行緒比起單執行緒,可以提高cpu利用率,多個執行緒同時執行,不會因為一個執行緒卡住而導致所有執行緒都要等待。
但是多執行緒並非完全是好事,它也可能帶來一些副作用,比如執行緒多了吃記憶體、多執行緒之間需要協調共享資源等
多程序和多執行緒
多程序的程式有php-fpm。
多程序比起多執行緒,是將執行單元,放大到了程序上面,也就是不論是資源分配的單元,還是執行的單元,都以程序為主。
你可以把耗時的任務分配到子程序進行,而主程序繼續執行。其實說起來,這也就是多執行緒,一個程序對應一個執行緒,那麼多個程序同時進行是否等於多個執行緒同時進行。
當然,從這個角度這麼理解是可以,但實際上多程序和多執行緒還是有很多差別,比如資源分配不一樣,程序排程和執行緒排程也是兩種策略。
多執行緒則在資源分配上按程序來,執行上按執行緒來,以執行緒執行的特性來提高cpu利用率,從而達到提升程式執行效率。
但據說,有IBM的人專門在unix和windows上做過實驗,在unix,多程序的設計效能比多執行緒更好,而windows上,多執行緒的設計效能比多程序更好。——這個我沒求證,未必可信。