linux進程池

進程池的概念:

進程池是由服務器預先創建好的一組子進程,子進程的數量大概在3-10個左右。進程池中的所有子進程都運行着相同的代碼,並且有着相同的屬性(如優先級)。當接到服務請求後,服務器會通過某種方式從已經存在的子進程中挑選出一個進行服務。

方式:

1.算法。包括隨機算法和輪流算法(Rount—Robin)。

2.共享消息隊列進程和所有子進程通過一個共享的工作隊列來同步,子進程都睡眠在該工作隊列上。當有新的任務到來時,主進程將任務添加到工作隊列中。這將喚醒正在等待任務的子進程,不過只有一個子進程獲得新任務的“接管權”,它可以從工作隊列中取出並執行之,而其他子進程將繼續睡眠在工作隊列上。


    當選擇好子進程後,主進程還需要使用某種通知機制來告訴目標子進程有新進程需要處理,並傳遞必要的數據。最簡單的方法是,在父進程和子進程之間預先建立好一條管道,然後通過該管道來實現所有進程間通信(當然,要預先定義好一套協議來規範管道的使用)。在父線程和子線程之間傳遞數據就要簡單的多,因爲我們可以把這些數據定義全局的,那麼他們本身就是被所有線程共享的。


2.進程池是用來處理多個客戶端。

   進程池處理多客戶任務時,就要考慮監聽sock連接sock是否都由主進程管理。

併發模型,其中半同步/半反應堆模式是由主進程統一管理這兩種socket的。而高效的半同步/半異步領導者/追隨者模式,則是由主進程管理所有監聽socket,而各個子進程分別管理屬於自己的連接socket的。

對於前一種情況,主進程接受新的連接以得到連接socket,然後它需要將該socket傳遞給子進程(對於線程池而言,父線程將socket傳遞給子線程是很簡單的。因爲他們可以很容易地共享該socket。但對於進程池而言,必須通過管道傳輸)。

後一種情況的靈活性更大一些,因爲子進程可以自己調用accept來接受新的連接,這樣該父進程就無須向子進程傳遞socket。

   常連接,即一個客戶的多次請求可以複用一個TCP連接。那麼,在設計進程池時還需要考慮:一個客戶連接上的所有任務是否始終由一個子進程來處理。如果說客戶任務是無狀態的,那麼我們可以考慮使用不同的進程爲該客戶不同請求服務。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章