應(yīng)用場景、池值確定、(IO bound/cpu bound)滞伟、線程池/進(jìn)程池選擇算法、負(fù)載均衡算法
概念
==進(jìn)程池==:由服務(wù)器預(yù)先創(chuàng)建的一組子進(jìn)程炕贵,子進(jìn)程的數(shù)目在3~10個
之間(httpd守護(hù)進(jìn)程使用7個子進(jìn)程的進(jìn)程池實現(xiàn)并發(fā)的梆奈,一般地線程池的線程數(shù)目應(yīng)該與CPU的數(shù)量差不多)
引入的原因(動態(tài)創(chuàng)建子進(jìn)程(或者子線程)來實現(xiàn)并發(fā)服務(wù)器的存在缺點)
- 動態(tài)創(chuàng)建進(jìn)程(或線程)比較耗費時間,這將導(dǎo)致較慢的客戶響應(yīng)
- 動態(tài)創(chuàng)建的子進(jìn)程通常只用來為一個客戶服務(wù)称开,這樣導(dǎo)致了系統(tǒng)上產(chǎn)生大量的細(xì)微進(jìn)程(或線程)亩钟。進(jìn)程和線程間的切換將消耗大量CPU時間
- 動態(tài)創(chuàng)建的子進(jìn)程是當(dāng)前進(jìn)程的完整映像,當(dāng)前進(jìn)程必須謹(jǐn)慎的管理其分配的文件描述符和堆內(nèi)存等系統(tǒng)資源鳖轰,否則子進(jìn)程可能復(fù)制這些資源径荔,從而使系統(tǒng)的可用資源急劇下降,進(jìn)而影響服務(wù)器的性能脆霎。
- 池子使用來限制并發(fā)的任務(wù)數(shù)目,限制我們的計算機在一個自己可承受的范圍內(nèi)去并發(fā)地執(zhí)行任務(wù)狈惫。
池子內(nèi)什么時候裝進(jìn)程:并發(fā)的任務(wù)屬于==計算密集型==
池子內(nèi)什么時候裝線程:并發(fā)的任務(wù)屬于==IO密集型==
進(jìn)程池中的子進(jìn)程的特點
- 都運行著相同的代碼睛蛛,具有相同的屬性,比如優(yōu)先級胧谈,PGID(組識別碼)等
- 進(jìn)程池在服務(wù)器啟動之初就創(chuàng)建好了忆肾,所以每個子進(jìn)程都相對"干凈",即它們沒有打開不必要的文件描述符(從父進(jìn)程繼承而來)
- 也不會錯誤地使用大塊的堆內(nèi)存(從父進(jìn)程復(fù)制得到)
新任務(wù)到來時菱肖,如何選擇子進(jìn)程客冈?
- 使用某種算法(隨機算法、Round Robin(輪流選擇))稳强,使任務(wù)在各個工作進(jìn)程中更均勻地分配场仲,從而減輕服務(wù)器的壓力
- 主進(jìn)程和所有子進(jìn)程通過一個共享的工作隊列來實現(xiàn)同步
:子進(jìn)程都睡眠在該工作隊列上和悦,當(dāng)有新的任務(wù)到來時,主進(jìn)程將任務(wù)添加到工作隊列中渠缕。這將喚醒正在等待任務(wù)的子進(jìn)程鸽素,不過只有一個子進(jìn)程將獲得新任務(wù)的“接管權(quán)”,它可以從工作隊列中取出任務(wù)并執(zhí)行之亦鳞,而其他子進(jìn)程將繼續(xù)睡眠在工作隊列上馍忽。 - 主進(jìn)程除了選擇好子進(jìn)程以外,還需要使用某種通知機制來告訴目標(biāo)子進(jìn)程有新任務(wù)需要處理燕差,并傳遞必要的數(shù)據(jù)遭笋。
最簡單的辦法:在父子進(jìn)程之間預(yù)先建立好一條管道,然后通過該管道來實現(xiàn)所有的進(jìn)程間通信(預(yù)先定義好協(xié)議來規(guī)范管道的使用)(==父子線程間就可以直接用全局變量==)
處理多客戶
監(jiān)聽socket和連接socket是否都由主進(jìn)程來統(tǒng)一管理徒探?
代碼實現(xiàn)參考: