高效能伺服器程式設計 程序池或執行緒池

2021-09-02 01:29:56 字數 2497 閱讀 2231

一般來說,伺服器的硬體資源相對充裕,很多時候都用空間換時間的方法來提高伺服器的效能,不惜浪費大量的空間資源來換取伺服器的執行效率。

具體做法:提前申請大量的資源,以備不時之需以及重複使用。這就是池的概念

池其實就是一組資源的集合。

靜態資源分配:這組資源在伺服器啟動之初,就已經被建立並初始化

動態資源分配:即由系統實時分配資源。

由系統呼叫分配資源非常耗時的,所以直接從池中取得資源的效率比動態分配資源的效率更高,避免了伺服器對核心的頻繁訪問,從而提高了伺服器的效能。

在實際當中,分配記憶體,建立程序,建立執行緒

都會涉及到一些系統呼叫。系統呼叫需要從使用者態切換到核心態,是非常耗時的操作。

因此當程式中頻繁的進行記憶體申請釋放,程序,執行緒頻繁建立和釋放的操作時,通常會通過使用記憶體池,程序池,執行緒池等技術來提公升程式的效能。

在c/c++中,動態向系統申請資源都是通過mallock和new(底層也是通過malloc)。如果對頻繁的申請使用會導致大量的記憶體碎片,不僅耗時,而且大量的記憶體碎片出現的結果是出現系統明明有大量的資源但是確無法使用(主要是外部碎片化)。

記憶體內部碎片化:在採用分割槽式儲存管理的系統(比如:分頁)時,假如程序所需要的空間小於分割槽塊(最後的乙個頁),則該分割槽塊剩餘的空間稱為內部碎片化。

記憶體外部碎片化:來自任何已分配區域或頁面外部的空閒儲存塊(還未分配,不屬於任何乙個程序),這些儲存塊的總和可以滿足當前申請的長度要求但是他們的位址不連續或其他原因,使得系統無法滿足當前的申請。這樣的空間被稱為外部碎片化。

為了解決外部碎片化以及申請效率(伺服器效率)問題我們提出了記憶體池的使用。

但是這裡還有一點要注意的問題:

當頻繁申請系統資源的時間,對於每次申請都會有指定大小的維護資訊

,若是頻繁的申請,那大部分的資源都會用來記錄這些維護資訊,導致記憶體的效率極其低下。記憶體池便解決了這個問題。

一:為什麼要提出執行緒池?或者說他有哪些作用或者可以解決那些問題?

1.針對伺服器而言,動態建立執行緒(或程序)比較耗費時間,這將導致較慢的客戶響應。

2.動態建立執行緒(或程序)將導致系統產生大量的細微程序(或執行緒),他們之間的切換將導致消耗大量的cpu時間。

3.動態建立的子程序是當前程序的完整映像。當前程序必須謹慎處理其分配的檔案描述符和堆記憶體等系統資源,否則子程序會轉殖這些資源,導致系統可用   資源急劇下降,進而影響伺服器效能。

分析:

程序池或執行緒池解決了上述問題。在伺服器啟動之初,便建立並初始化了3~10個(一般情況)之間的數量。

同時呢執行緒池中的數量應該和cpu中的差不多。

程序池中的所有子程序都執行著相同的**,並具有相同的屬性:優先順序,pgid等。因為程序池是在伺服器啟動之初就建立好了,所以每個程序都相對「乾淨」

,沒有開啟不必要的檔案描述符以及堆區的資源(父程序中轉殖)。 

執行緒池的設計思路:

在伺服器程式啟動時,建立出多個程序或多個執行緒,將其維護在池中,當有客戶連線時,就從池中分配程序或執行緒為客戶服務。

主線程(父程序):負責和客戶端進行連線。

函式執行緒(子程序):用來和客戶端進行連線。

檢視系統維護的程序池和執行緒池:

執行緒池的實現難點

1.主線程需要將檔案描述符傳遞給函式執行緒。(執行緒間的通訊,全域性變數/static)

2.函式執行緒啟動起來後必須阻塞到獲取檔案描述符之前(只有當全域性陣列中有檔案描述符時才不阻塞。pv操作)

3.訊號量來控制主線程向函式執行緒通知獲取檔案描述符事件(pv操作)。

4.主線程在陣列中插入資料,以及函式執行緒獲取陣列中的資料都必須時互斥的。(防止獲取,或者插入時出現不安全的問題)

1.單個任務小且任務數量巨大。比如:web伺服器完成網頁請求這樣的任務;對於長時間的任務,比如乙個telnet連線請求,因為telnet的會話時間比執行緒建立時間大多了。

2.對效能要求苛刻的應用,比如伺服器迅速響應客戶請求。

3.短時間內,必須處理大量的連線請求(執行緒建立的時間小於程序建立時間)

高效能伺服器程式設計 程序池 執行緒池

高效能伺服器程式設計主要分為多程序和多執行緒 程序池和執行緒池,用來處理乙個服務程式能夠同時處理多個客戶連線的問題。我們首先回顧下多程序和多執行緒的知識,因為程序池和執行緒池是在這個基礎上進行改進的,也是伺服器用的比較多的。多程序 accept 建立子程序,由子程序和客戶端通訊。父程序繼續接受客戶連...

高效能伺服器程式設計 執行緒池

在我們之前所講述過的以poll方式實現tcp伺服器流程,我們仔細研究一下會發現,客戶端的資料我們還是以序列的方式來處理的。由此我們提出了以多程序或者多執行緒的方式來加以實現是不是會更好。比如採用多程序的方式 但是這種方式還是會有bug出現,比如有僵死程序的情況出現和建立程序的代價很大等情況發生。此處...

執行緒池實現高效能伺服器

為了改善多程序和多執行緒實現伺服器不停地建立刪除程序或執行緒給系統帶來的負擔,引進了執行緒池,程序池來改善此種情況,此處以執行緒池為例。執行緒池的優勢 1 建立的程序或者執行緒是有限的,伺服器的系統代價比較小,一般不會到達系統限制的值。2 伺服器不需要頻繁的建立 銷毀程序或者執行緒,只在伺服器啟動時...