2020年11月15日 星期日

同步、非同步、程序執行緒、主程序、子程序、主執行緒、子執行緒

同步和非同步

非同步(異步)執行的主要目的,就是讓程序不會阻礙任何事情,也可以說是讓程序不用被阻擋等著 I/O 處理完,遇到非同步任務時,會把它放到事件佇列(Event Queue)中,先跑下一行程式碼,等函式中的 callback 被呼叫的時候再執行接著要做的事。

同步就是照著順序做,等著前面做完才能執行後面的程式碼。在單執行緒,若要求程式等待兩秒後再處理某段程式,你的程式在這兩秒之間是被凍住的,沒有任何事情會發生。


程序

當一個程式被執行,作業系統就會為這個程式生成一個程序,以管理該程式執行過程中記憶體和系統資源的分配。

程序是程式被執行時,作業系統的管理單元,並且,程序也是作業系統分配資源的最小單元。


執行緒

執行緒是比程序更小的單元,它是cpu的最小執行單元(當然,現在還有協程)。一個程序,至少包含一個或多個執行緒。


主程序和子程序

程式執行之後,有些複雜的任務一個程序是無法完成的,這時候就有了多程序的概念。多程序中,便有了主程序和子程序。主程序是程式執行的中樞,它負責統籌安排。而子程序則通常負責具體的事務。

比如php-fpm的設計,它就有一個主程序,當fpm被執行的時候,會有一條主程序長時間執行,而當有具體的請求到達伺服器時,主程序會開啟一些子程序去專門處理請求。


主執行緒和子執行緒

同樣,既然一個程序能夠被拆分成多個執行緒,那麼,執行緒也是有主次之分的。

比如,一個程序,初始化的時候,通常是一個執行緒在執行的,而當需要處理一些耗時長的任務時(比如IO操作),就會讓開啟一條子執行緒,讓子執行緒去做這個事情,然後主執行緒繼續執行接下去的任務,這便是多執行緒。


單執行緒和多執行緒

單執行緒的程序,有一個特性就是順序執行,當遇到比較耗時的任務時,還未執行的任務就會處於等待狀態,一定要等到前面的任務完成了,才會往後執行。

多執行緒在軟體層面,可以說是多個執行緒同時執行,但在物理層面,cpu如果是單核,那多個執行緒之間就總得有個先後(這涉及到cpu的執行緒排程、時間片輪轉知識)

多執行緒比起單執行緒,可以提高cpu利用率,多個執行緒同時執行,不會因為一個執行緒卡住而導致所有執行緒都要等待。

但是多執行緒並非完全是好事,它也可能帶來一些副作用,比如執行緒多了吃記憶體、多執行緒之間需要協調共享資源等。


應用

綜合以上,在Server端以單執行緒非同步架構似乎是比較適合的(流量大,如果同步多緒行緒,主機資源一下就被用完),在client單機上,適合多執行緒架構(沒有大流量問題,把CPU和記憶體發揮到極限吧~)。

沒有留言:

張貼留言