在系統開發過程中,我們經常會用到池化技術來減少系統消耗,提公升系統效能。物件池通過復用物件來減少建立物件、垃圾**的開銷;連線池(資料庫連線池、redis連線池和http連線池等)通過復用tcp連線來減少建立和釋放連線的時間。執行緒池通過復用執行緒提公升效能。簡單來說,池化技術就是通過復用來提公升效能。
執行緒、記憶體、資料庫的連線物件都是資源,在程式中,當你建立乙個執行緒或者在堆上申請一塊記憶體的時候都涉及到很多的系統呼叫,也是非常消耗cpu的。如果你的程式需要很多類似的工作執行緒或者需要頻繁地申請釋放小塊記憶體,在沒有對這方面進行優化的情況下,這部分**很可能會成為影響你整個程式效能的瓶頸。
執行緒池
執行緒池的原理很簡單,類似於作業系統中的緩衝區的概念。執行緒池中會先啟動若干數量的執行緒,這些執行緒都處於睡眠狀態。當客戶端有乙個新的請求時,就會喚醒執行緒池中的某乙個睡眠的執行緒,讓它來處理客戶端的這個請求,當處理完這個請求之後,執行緒又處於睡眠的狀態。
執行緒池能很高地提公升程式的效能。比如有乙個省級資料大集中的銀行網路中心,高峰期每秒的客戶端請求併發數超過100,如果為每個客戶端請求建立乙個新的執行緒的話,那耗費的cpu時間和記憶體都是十分驚人的,如果採用乙個擁有200個執行緒的執行緒池,那將會節約大量的系統資源,使得更多的cpu時間和記憶體用來處理實際的商業應用,而不是頻繁的執行緒建立和銷毀。
記憶體池
如何更好地管理應用程式記憶體的使用,同時提高記憶體使用的頻率,這時值得每乙個開發人員深思的問題。記憶體池(memory pool)就提供了乙個比較可行的解決方案。
記憶體池在建立的過程中,會預先分配足夠大的記憶體,形成乙個初步的記憶體池。然後每次使用者請求記憶體的時候,就會返回記憶體池中的一塊空閒的記憶體,並將這塊記憶體的標誌置為已使用。當記憶體使用完畢釋放記憶體的時候,也不是真正地呼叫free或delete的過程,而是把內存放回記憶體池的過程,且放回的過程要把標誌置為空閒。最後,應用程式結束,就會將記憶體池銷毀,將記憶體池中的每一塊記憶體釋放。
使用記憶體池的優點
1.減少記憶體碎片的產生。這個優點可以從建立記憶體池的過程中看出,當我們在建立記憶體池的時候,分配的都是一塊塊比較規整的記憶體塊,減少記憶體碎片的產生。
2.提高了記憶體的使用頻率。這個可以從分配記憶體和釋放記憶體的過程中看出。每次的分配和釋放並不是去呼叫系統提供的函式或操作符去操作實際的記憶體,而是在復用記憶體池中的記憶體。
使用記憶體池的缺點
缺點就是很可能會造成記憶體的浪費,因為要使用記憶體池需要在一開始分配一大塊閒置的記憶體,而這些記憶體不一定全部被用到。
資料庫連線池
資料庫連線池的基本思想是在系統初始化的時候將資料庫連線作為物件儲存在記憶體中,當使用者需要訪問資料庫的時候,並非建立乙個新的連線,而是從連線池中取出乙個已建立的空閒連線物件。在使用完畢後,使用者也不是將連線關閉,而是將連線放回到連線池中,以供下乙個請求訪問使用。這些連線的建立、斷開都由連線池自身來管理。
同時,還可以設定連線池的引數來控制連線池中的初始連線數、連線的上下限數和每個連線的最大使用次數、最大空閒時間等。當然,也可以通過連線池自身的管理機制來監視連線的數量、使用情況等。
httpclient連線池
httpclient我們經常用來進行http服務訪問。我們的專案中會有乙個獲取任務執行狀態的功能使用httpclient,一秒鐘請求一次,經常會出現conection reset異常。經過分析發現,問題是出在httpclient的每次請求都會新建乙個連線,當建立連線的頻率比關閉連線的頻率大的時候,就會導致系統中產生大量處於time_closed狀態的連線。這個時候使用連線池復用連線就能解決這個問題。
總結
不難看出,這些池化技術的實現原理都是類似的,都是通過對連線或執行緒的復用,並對復用的數量、時間等進行控制,從而使系統的效能和資源消耗達到最優的狀態。
實際專案中,我們可以考慮使用池化技術來解決程式效能上的瓶頸。
"祝你歲月無波瀾,敬我餘生不悲歡。"
池化技術 執行緒池
執行緒池 任務 等待任務 全域性的任務佇列queue無任務且無銷毀,任務新增函式 等待add的signal 載入任務 add將新建任務指標task賦予queue 執行任務 執行緒池內任一rtn獲取當前佇列的頭 第乙個任務task 執行,並將此任務從佇列中剔除 退出執行緒池內某一rtn 根據實際的程式...
物件池化技術
物件池化技術 物件池化的基本思路是 將用過的物件儲存起來,等下一次需要這種物件的時候,再拿出來重複使用,從而在一定程度上減少頻繁建立物件所造成的開銷。用於充當儲存物件的 容器 的物件,被稱為 物件池 object pool,或簡稱pool 對於沒有狀態的物件 例如string 在重複使用之前,無需進...
池化技術總結
導言 池化是乙個幾乎所有做深度學習的人都了解的乙個技術,大家對池化如何進行前向傳播也都了解,池化的作用也了解一二。然而,池化如何回傳梯度呢,池化回傳梯度的原則是什麼呢,最大池化與平均池化的區別是什麼呢,什麼時候選擇最大池化 什麼時候選擇平均池化呢。主要用的池化操作有平均池化 最大池化 全域性平均池化...