在傳統UNIX中較常用,針對每壹種單獨的業務邏輯的實例生成不同的線程進行處理。典型的程序實例是針對TCP的多個不同的客戶端連接,fork出多個子進程進行處理,每壹個客戶端對應壹個單獨的子進程,在子進程處理退出後,由父進程回收其資源。
優點:各進程間的地址空間相互隔離,不會因為某些不當操作將整個應用搞掛。
業務邏輯代碼簡單清晰,代碼平鋪直敘,沒有復雜的異步狀態邏輯。
缺點:如果需要在進程間進行交互或者***享數據,需要使用IPC。
2、多線程並發
在現代操作系統windows、linux中很常用,針對單獨的業務邏輯的不同的實例在同壹個進程中創建多個線程進行並發處理。典型的例子是,TCP的多個客戶端在同壹個進程中處理,針對每個客戶端都單獨對應的線程進行交互,***享同壹個進程的所有資源。
優點:***享進程空間,訪問***享數據非常容易。
沒有多的進程空間開銷,線程上下文切換快,調度效率比多進程高。
業務邏輯代碼簡單清晰,代碼平鋪直敘,沒有復雜的異步狀態邏輯。
缺點:維護線程的工作由進程內部代碼處理,比如線程數量,增加壹定的復雜性。
線程間***享數據的競爭關系復雜,需要處理同步和死鎖問題。
3、IO多路復用
即在單線程控制多個異步業務邏輯,也就是事件驅動多個業務的狀態處理,典型的有windows中的消息處理機制,還有linux中的信號量處理。可以在單壹線程中,處理多種不同的業務邏輯,比如同時處理用戶輸出,鼠標點擊,窗口重繪和網絡輸入。
優點:所有業務實例的邏輯在單壹線程中處理,排除代碼時序BUG,理論上不存在競爭和死鎖問題。
沒有多的進程空間開銷,也沒有上下文切換問題,CPU利用率高。
***享進程空間,訪問***享數據非常容易。
缺點:
線程需要管理多個不同實例的狀態機,並正確處理對應事件導致不同狀態的遷移。
業務種類多的情況下,需要人為代碼控制多種狀態機。
並發點越多造成狀態越多,管理粒度越細, 業務邏輯代碼不是順序的,不容易維護和理解。
異步狀態過多,造成資源管理較為復雜,容易產生資源泄漏。